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

#ifndef EAGLE0_AIATTACKERSTRATEGYSELECTOR_HPP
#define EAGLE0_AIATTACKERSTRATEGYSELECTOR_HPP

#include "src/main/cpp/net/eagle0/shardok/ai/AIAttackLocations.hpp"
#include "src/main/cpp/net/eagle0/shardok/ai/AICommonTypes.hpp"
#include "src/main/cpp/net/eagle0/shardok/ai/AIStrategy.hpp"
#include "src/main/cpp/net/eagle0/shardok/ai/AIWaterCrossingCommandChooser.hpp"
#include "src/main/cpp/net/eagle0/shardok/library/GameStateW.hpp"
#include "src/main/cpp/net/eagle0/shardok/library/ShardokCommand.hpp"
#include "src/main/cpp/net/eagle0/shardok/library/action_point_distances/ActionPointDistancesCache.hpp"
#include "src/main/cpp/net/eagle0/shardok/library/map/CoordsSet.hpp"

namespace shardok {

class AIAttackerStrategySelector {
public:
    static auto BestAttackerStrategy(
            PlayerId attackerPid,
            const GameStateW& gameState,
            const CoordsSet& criticalTileCoords,
            int maxRounds,
            const APDCache& apdCache,
            const ALCache& alCache,
            const BattalionTypeGetter& battalionTypeGetter,
            ActionPoints braveWaterCost,
            const AIWaterCrossingCommandChooser& waterCrossingCommandChooser,
            const CommandListSPtr& availableCommands) -> AIStrategy;
};

}  // namespace shardok
#endif  // EAGLE0_AIATTACKERSTRATEGYSELECTOR_HPP
