--[[-- Commands Module - Repair
    - Adds a command that allows an admin to repair and revive a large area
    @commands Repair
]]

local Commands = require 'expcore.commands' --- @dep expcore.commands
local config = require 'config.repair' --- @dep config.repair
require 'config.expcore.command_general_parse'

local max_time_to_live = 4294967295 -- unit32 max
--- Repairs entities on your force around you
-- @command repair
-- @tparam number range the range to repair stuff in, there is a max limit to this
Commands.new_command('repair', 'Repairs entities on your force around you')
:add_param('range', false, 'integer-range', 1, config.max_range)
:register(function(player, range)
    local revive_count = 0
    local heal_count = 0
    local range2 = range^2
    local surface = player.surface
    local center = player.position
    local area = {{x=center.x-range, y=center.y-range}, {x=center.x+range, y=center.y+range}}
    if config.allow_ghost_revive then
        local ghosts = surface.find_entities_filtered({area=area, type='entity-ghost', force=player.force})
        for _, ghost in pairs(ghosts) do
            if ghost.valid then
                local x = ghost.position.x-center.x
                local y = ghost.position.y-center.y
                if x^2+y^2 <= range2 then
                    if config.allow_blueprint_repair or ghost.time_to_live ~= max_time_to_live then
                        revive_count = revive_count+1
                        if not config.disallow[ghost.ghost_name] then ghost.revive() end
                    end
                end
            end
        end
    end
    if config.allow_heal_entities then
        local entities = surface.find_entities_filtered({area=area, force=player.force})
        for _, entity in pairs(entities) do
            if entity.valid then
                local x = entity.position.x-center.x
                local y = entity.position.y-center.y
                if entity.health and entity.get_health_ratio() ~= 1 and x^2+y^2 <= range2 then
                    heal_count = heal_count+1
                    entity.health = max_time_to_live
                end
            end
        end
    end
    return Commands.success{'expcom-repair.result', revive_count, heal_count}
end)