//
// Created by Dan Crosby on 1/10/22.
//

#ifndef EAGLE0_SHARDOK_AI_AI_STRATEGY_HPP
#define EAGLE0_SHARDOK_AI_AI_STRATEGY_HPP

#include "src/main/cpp/net/eagle0/shardok/ai/AIAttackGroups.hpp"

namespace shardok {

struct AIStrategy {
    enum StrategyType {
        STRATEGY_ATTACK_CASTLES,
        STRATEGY_ATTACK_UNITS,
        STRATEGY_HOLD_CASTLES,
        STRATEGY_SCATTER,
        STRATEGY_FLEE,
        STRATEGY_CROSS_RIVERS
    };

    StrategyType strategyType;

    vector<TargetPriorityList> targetPriorities{};
    CoordsSet targetLocations = CoordsSet(0, 0);
};

extern AIStrategy FleeStrategy;
[[nodiscard]] auto AttackUnitsStrategy(const vector<TargetPriorityList>& targetPriorities)
        -> AIStrategy;
[[nodiscard]] auto AttackCastlesStrategy(const vector<TargetPriorityList>& targetPriorities)
        -> AIStrategy;
extern AIStrategy HoldCastlesStrategy;
extern AIStrategy ScatterStrategy;
[[nodiscard]] auto CrossRiversStrategy(const CoordsSet& targetLocations) -> AIStrategy;

}  // namespace shardok

#endif  // EAGLE0_SHARDOK_AI_AI_STRATEGY_HPP
