--luacheck: ignore
local Immersive_cargo_wagons = require 'modules.immersive_cargo_wagons.main'
local Public = {}

local market_offers = {
    { price = { { 'coin', 4 } },                                    offer = { type = 'give-item', item = 'raw-fish' } },
    { price = { { 'coin', 12 } },                                   offer = { type = 'give-item', item = 'wood', count = 50 } },
    { price = { { 'coin', 12 } },                                   offer = { type = 'give-item', item = 'iron-ore', count = 50 } },
    { price = { { 'coin', 12 } },                                   offer = { type = 'give-item', item = 'copper-ore', count = 50 } },
    { price = { { 'coin', 12 } },                                   offer = { type = 'give-item', item = 'stone', count = 50 } },
    { price = { { 'coin', 12 } },                                   offer = { type = 'give-item', item = 'coal', count = 50 } },
    { price = { { 'coin', 20 } },                                   offer = { type = 'give-item', item = 'uranium-ore', count = 50 } },
    { price = { { 'coin', 8 } },                                    offer = { type = 'give-item', item = 'crude-oil-barrel', count = 1 } },
    { price = { { 'explosives', 5 }, { 'steel-plate', 1 }, { 'coin', 1 } }, offer = { type = 'give-item', item = 'land-mine', count = 1 } }
}

function Public.locomotive_spawn(surface, position)
    for y = -6, 6, 2 do
        surface.create_entity({ name = 'straight-rail', position = { position.x, position.y + y }, force = 'player', direction = 0 })
    end
    storage.locomotive = surface.create_entity({ name = 'locomotive', position = { position.x, position.y + -3 }, force = 'player' })
    storage.locomotive.get_inventory(defines.inventory.fuel).insert({ name = 'wood', count = 100 })

    storage.locomotive_cargo = surface.create_entity({ name = 'cargo-wagon', position = { position.x, position.y + 3 }, force = 'player' })
    storage.locomotive_cargo.get_inventory(defines.inventory.cargo_wagon).insert({ name = 'raw-fish', count = 1 })

    rendering.draw_light(
        {
            sprite = 'utility/light_medium',
            scale = 5.5,
            intensity = 1,
            minimum_darkness = 0,
            oriented = true,
            color = { 255, 255, 255 },
            target = storage.locomotive,
            surface = surface,
            visible = true,
            only_in_alt_mode = false
        }
    )

    rendering.draw_light(
        {
            sprite = 'utility/light_medium',
            scale = 5.5,
            intensity = 1,
            minimum_darkness = 0,
            oriented = true,
            color = { 255, 255, 255 },
            target = storage.locomotive_cargo,
            surface = surface,
            visible = true,
            only_in_alt_mode = false
        }
    )

    storage.locomotive.color = { 0, 255, 0 }
    storage.locomotive_cargo.minable = false
    storage.locomotive.minable = false

    for y = -1, 0, 0.05 do
        local scale = math.random(50, 100) * 0.01
        rendering.draw_sprite(
            {
                sprite = 'item/raw-fish',
                orientation = math.random(0, 100) * 0.01,
                x_scale = scale,
                y_scale = scale,
                tint = { math.random(75, 255), math.random(75, 255), math.random(75, 255) },
                render_layer = 'selection-box',
                target = storage.locomotive_cargo,
                target_offset = { -0.7 + math.random(0, 140) * 0.01, y },
                surface = surface
            }
        )
    end

    local wagon = Immersive_cargo_wagons.register_wagon(storage.locomotive)
    wagon.entity_count = 999

    local wagon = Immersive_cargo_wagons.register_wagon(storage.locomotive_cargo)
    wagon.entity_count = 999

    local surface = wagon.surface
    local center_position = {
        x = wagon.area.left_top.x + (wagon.area.right_bottom.x - wagon.area.left_top.x) * 0.5,
        y = wagon.area.left_top.y + (wagon.area.right_bottom.y - wagon.area.left_top.y) * 0.5
    }

    local position = surface.find_non_colliding_position('market', center_position, 128, 0.5)
    local market = surface.create_entity({ name = 'market', position = position, force = 'neutral', create_build_effect_smoke = false })
    market.minable = false
    market.destructible = false
    for _, offer in pairs(market_offers) do
        market.add_market_item(offer)
    end

    local position = surface.find_non_colliding_position('market', center_position, 128, 0.5)
    local e = surface.create_entity({ name = 'big-biter', position = position, force = 'player', create_build_effect_smoke = false })
    e.ai_settings.allow_destroy_when_commands_fail = false
    e.ai_settings.allow_try_return_to_spawner = false

    for x = center_position.x - 5, center_position.x + 5, 1 do
        for y = center_position.y - 5, center_position.y + 5, 1 do
            if math.random(1, 2) == 1 then
                surface.spill_item_stack({ x + math.random(0, 9) * 0.1, y + math.random(0, 9) * 0.1 }, { name = 'raw-fish', count = 1 }, false)
            end
            surface.set_tiles({ { name = 'blue-refined-concrete', position = { x, y } } }, true)
        end
    end
    for x = center_position.x - 3, center_position.x + 3, 1 do
        for y = center_position.y - 3, center_position.y + 3, 1 do
            if math.random(1, 2) == 1 then
                surface.spill_item_stack({ x + math.random(0, 9) * 0.1, y + math.random(0, 9) * 0.1 }, { name = 'raw-fish', count = 1 }, false)
            end
            surface.set_tiles({ { name = 'cyan-refined-concrete', position = { x, y } } }, true)
        end
    end
end

function Public.fish_tag()
    if not storage.locomotive_cargo then
        return
    end
    if not storage.locomotive_cargo.valid then
        return
    end
    if not storage.locomotive_cargo.surface then
        return
    end
    if not storage.locomotive_cargo.surface.valid then
        return
    end
    if storage.locomotive_tag then
        if storage.locomotive_tag.valid then
            if storage.locomotive_tag.position.x == storage.locomotive_cargo.position.x and storage.locomotive_tag.position.y == storage.locomotive_cargo.position.y then
                return
            end
            storage.locomotive_tag.destroy()
        end
    end
    storage.locomotive_tag =
        storage.locomotive_cargo.force.add_chart_tag(
            storage.locomotive_cargo.surface,
            {
                icon = { type = 'item', name = 'raw-fish' },
                position = storage.locomotive_cargo.position,
                text = ' '
            }
        )
end

function Public.set_player_spawn_and_refill_fish()
    if not storage.locomotive_cargo then
        return
    end
    if not storage.locomotive_cargo.valid then
        return
    end
    local position = storage.locomotive_cargo.surface.find_non_colliding_position('stone-furnace', storage.locomotive_cargo.position, 16, 2)
    if position then
        game.forces.player.set_spawn_position({ x = position.x, y = position.y }, storage.locomotive_cargo.surface)
    end
    return true
end

return Public
