-- Cut off a limb, and two more shall take its place!
local Event = require 'utils.event'
local CreateParticles = require 'features.create_particles'
local random = math.random
local floor = math.floor
local ceil = math.ceil
local pairs = pairs
local compound = defines.command.compound
local logical_or = defines.compound_command.logical_or
local attack = defines.command.attack
local attack_area = defines.command.attack_area
local config = global.config.hail_hydra
local evolution_scale = config.evolution_scale
local hydras = config.hydras

local function create_attack_command(position, target)
    local command = {type = attack_area, destination = position, radius = 10}
    if target then
        command = {type = compound, structure_type = logical_or, commands = {
            {type = attack, target = target},
            command,
        }}
    end

    return command
end


Event.add(defines.events.on_entity_died, function (event)
    local entity = event.entity
    local name = entity.name

    local hydra = hydras[name]
    if not hydra then
        return
    end

    local position = entity.position
    local force = entity.force
    local evolution_factor = force.evolution_factor * evolution_scale
    local cause = event.cause

    local surface = entity.surface
    local create_entity = surface.create_entity
    local find_non_colliding_position = surface.find_non_colliding_position

    local command = create_attack_command(position, cause)

    for hydra_spawn, amount in pairs(hydra) do
        amount = amount + evolution_factor

        local extra_chance = amount % 1
        if extra_chance > 0 then
            if random() <= extra_chance then
                amount = ceil(amount)
            else
                amount = floor(amount)
            end
        end
        local particle_count

        if amount > 4 then
            particle_count = 60
        else
            particle_count = amount * 15
        end

        CreateParticles.blood_explosion(create_entity, particle_count, position)

        for _ = amount, 1, -1  do
            position = find_non_colliding_position(hydra_spawn, position, 2, 0.4) or position
            local spawned = create_entity({name = hydra_spawn, force = force, position = position})
            if spawned and spawned.type == 'unit' then
                spawned.set_command(command)
            elseif spawned and cause then
                spawned.shooting_target = cause
            end
        end
    end
end)
