//
// Abstract action interface for MCTS
//

#ifndef EAGLE0_MCTS_ACTION_HPP
#define EAGLE0_MCTS_ACTION_HPP

#include <memory>
#include <string>

namespace shardok {
namespace mcts {

// Abstract interface for game actions
class MCTSAction {
public:
    virtual ~MCTSAction() = default;

    // Get a unique index for this action (used for command indexing)
    [[nodiscard]] virtual size_t getIndex() const = 0;

    // Get a human-readable description for debugging/logging
    [[nodiscard]] virtual std::string getDescription() const = 0;

    // Create a deep copy of this action
    [[nodiscard]] virtual std::unique_ptr<MCTSAction> clone() const = 0;

    // Check if two actions are equivalent
    [[nodiscard]] virtual bool equals(const MCTSAction& other) const = 0;
};

}  // namespace mcts
}  // namespace shardok

#endif  // EAGLE0_MCTS_ACTION_HPP