local H = wesnoth.require "lua/helper.lua"
local AH = wesnoth.require "ai/lua/ai_helper.lua"

local function get_next_sheep(cfg)
    local sheep = AH.get_units_with_moves {
        side = wesnoth.current.side,
        { "and", cfg.filter_second },
        { "filter_adjacent", { side = wesnoth.current.side, { "and", cfg.filter } } }
    }
    return sheep[1]
end

local ca_herding_sheep_runs_dog = {}

function ca_herding_sheep_runs_dog:evaluation(ai, cfg)
    -- Any sheep with moves left next to a dog runs away
    if get_next_sheep(cfg) then return cfg.ca_score end
    return 0
end

function ca_herding_sheep_runs_dog:execution(ai, cfg)
    -- Simply get the first sheep, order does not matter
    local sheep = get_next_sheep(cfg)

    -- Get the first dog that the sheep is adjacent to
    local dog = wesnoth.get_units { side = wesnoth.current.side, { "and", cfg.filter },
        { "filter_adjacent", { x = sheep.x, y = sheep.y } }
    }[1]

    local c_x, c_y = cfg.herd_x, cfg.herd_y
    -- If dog is farther from center, sheep moves in, otherwise it moves out
    local sign = 1
    if (H.distance_between(dog.x, dog.y, c_x, c_y) >= H.distance_between(sheep.x, sheep.y, c_x, c_y)) then
        sign = -1
    end
    local best_hex = AH.find_best_move(sheep, function(x, y)
        return H.distance_between(x, y, c_x, c_y) * sign
    end)

    AH.movefull_stopunit(ai, sheep, best_hex)
end

return ca_herding_sheep_runs_dog
