#pragma once

#include <memory>
#include <string>
#include <vector>
#include "warfactory/IDataNode.h"

class WorldData;
class IWorldGenerationStep;

namespace warfactory {

class IWorldGenerationPhase {
public:
    virtual ~IWorldGenerationPhase() = default;

    virtual std::string getPhaseName() const = 0;

    virtual std::vector<std::unique_ptr<IWorldGenerationStep>> getSteps() const = 0;

    virtual bool execute(WorldData& world, const IDataNode& config) = 0;

    virtual float getProgress() const = 0;

    virtual bool isComplete() const = 0;

    virtual void reset() = 0;

    virtual std::string getPhaseDescription() const = 0;

    virtual int getPhaseNumber() const = 0;

    virtual std::vector<std::string> getRequiredPreviousPhases() const = 0;

    virtual std::vector<std::string> getProducedData() const = 0;

    virtual bool canExecute(const WorldData& world) const = 0;
};

} // namespace warfactory