local Event = require 'utils.event'
local Color = require 'resources.color_presets'
local Item_to_chest = require 'map_gen.maps.quadrants.item_to_chest'
local Settings = require 'map_gen.maps.quadrants.settings'
local pow = math.pow

local rail_locations = {24, 32, 192, 224}

--192 to 224
--32 to 24

local function clear_inventory_train(event)
    local player_index = event.player_index
    local player = game.get_player(player_index)
    if (not player.driving and event.trigger == nil) or (player.driving and event.trigger) then
        return false
    end
    if not(Settings.features.train_crossings.enabled) then
        return true
    end
    local pos = player.physical_position
    local force = player.force

    local within_range = false
    local rail_location
    if string.find(force.name, 'quadrant') then
        if (force.name == 'quadrant1') then
            within_range = (pos.x >= 0 and pos.y <= 0)
            rail_location = {
                {{x = rail_locations[3], y = -rail_locations[2]}, {x = rail_locations[4], y = -rail_locations[1]}},
                {{x = rail_locations[1], y = -rail_locations[3]}, {x = rail_locations[2], y = -rail_locations[4]}},
                {{x = rail_locations[1], y = -rail_locations[1]}, {x = rail_locations[4], y = -rail_locations[4]}},
                'Quadrant #1'
            }
        elseif (force.name == 'quadrant2') then
            within_range = (pos.x <= 0 and pos.y <= 0)
            rail_location = {
                {{x = -rail_locations[3], y = -rail_locations[2]}, {x = -rail_locations[4], y = -rail_locations[1]}},
                {{x = -rail_locations[1], y = -rail_locations[3]}, {x = -rail_locations[2], y = -rail_locations[4]}},
                {{x = -rail_locations[1], y = -rail_locations[1]}, {x = -rail_locations[4], y = -rail_locations[4]}},
                'Quadrant #2'
            }
        elseif (force.name == 'quadrant3') then
            within_range = (pos.x <= 0 and pos.y >= 0)
            rail_location = {
                {{x = -rail_locations[3], y = rail_locations[2]}, {x = -rail_locations[4], y = rail_locations[1]}},
                {{x = -rail_locations[1], y = rail_locations[3]}, {x = -rail_locations[2], y = rail_locations[4]}},
                {{x = -rail_locations[1], y = rail_locations[1]}, {x = -rail_locations[4], y = rail_locations[4]}},
                'Quadrant #3'
            }
        elseif (force.name == 'quadrant4') then
            within_range = (pos.x >= 0 and pos.y >= 0)
            rail_location = {
                {{x = rail_locations[3], y = rail_locations[2]}, {x = rail_locations[4], y = rail_locations[1]}},
                {{x = rail_locations[1], y = rail_locations[3]}, {x = rail_locations[2], y = rail_locations[4]}},
                {{x = rail_locations[1], y = rail_locations[1]}, {x = rail_locations[4], y = rail_locations[4]}},
                'Quadrant #4'
            }
        end
    end

    if within_range then
        return false
    end
    player.clear_cursor()
    if
        player.get_inventory(defines.inventory.character_main).is_empty() and
            player.get_inventory(defines.inventory.character_trash).is_empty()
     then
        return true
    end

    local distance1 = pow(pow(rail_location[1][1].x - pos.x, 2) + pow(rail_location[1][1].y - pos.y, 2), 0.5)
    local distance2 = pow(pow(rail_location[2][1].x - pos.x, 2) + pow(rail_location[2][1].y - pos.y, 2), 0.5)

    local function wrap_transfer(bounding_box, radius)
        return Item_to_chest.transfer_inventory(
            player_index,
            {defines.inventory.character_main, defines.inventory.character_trash},
            nil,
            radius,
            bounding_box
        )
    end

    local success
    if distance1 <= distance2 then
        success = wrap_transfer(rail_location[1]) or wrap_transfer(rail_location[2])
    else
        success = wrap_transfer(rail_location[2]) or wrap_transfer(rail_location[1])
    end

    if not success then
        success = wrap_transfer(rail_location[3]) or wrap_transfer(nil, 0)
    end

    player.print({"", {'quadrants.train_notice1', rail_location[4]}, " [gps=" .. success.x .. ', ' .. success.y .. "]"}, {color = Color.red})
    return success
end

local function clear_inventory(event)
    event.trigger = true
    if not clear_inventory_train(event) then
        return
    end
    local player = game.get_player(event.player_index)
    local pos = player.physical_position
    local quadrant
    if (pos.x >= 0 and pos.y <= 0) then
        quadrant = 1
    elseif (pos.x <= 0 and pos.y <= 0) then
        quadrant = 2
    elseif (pos.x <= 0 and pos.y >= 0) then
        quadrant = 3
    elseif (pos.x >= 0 and pos.y >= 0) then
        quadrant = 4
    end

    player.force = game.forces['quadrant' .. quadrant]
end

Event.add(defines.events.on_player_driving_changed_state, clear_inventory)
Event.add(defines.events.on_player_dropped_item, clear_inventory_train)
Event.add(defines.events.on_player_fast_transferred, clear_inventory_train)
Event.add(defines.events.on_gui_opened, clear_inventory_train)
