#ifndef SURVIVAL_WORLD_GENERATOR_HPP_
#define SURVIVAL_WORLD_GENERATOR_HPP_

#include <Chunk/Chunk.hpp>
#include <GeneratorNode/GeneratorNode.hpp>
#include <Utilities/Extern.hpp>
#include <TerrainGenerator/TerrainGenerator.hpp>
#include <TunnelGenerator/TunnelGenerator.hpp>
#include <UndergroundGenerator/UndergroundGenerator.hpp>
#include <DecorationGenerator/DecorationGenerator.hpp>
#include <MantleGenerator/MantleGenerator.hpp>
#include <WorldGenerator/WorldGenerator.hpp>

class LocalWorld;

/**
 * @brief Represents the world generator.
 */
class SurvivalWorldGenerator final : public WorldGenerator
{
private:
    LocalWorld& world;
    GeneratorNode worldGenNode;

public:
    TerrainGenerator terrain;
    UndergroundGenerator underground;
    TunnelGenerator tunnels;
    DecorationGenerator decorations;
    MantleGenerator mantle;

    /**
     * @brief Construct this world generator with the specified local world and seed.
     */
    SurvivalWorldGenerator(LocalWorld &world, uint64_t seed);

    /**
     * @brief Return a reference to the world.
     */
    LocalWorld& getWorld();

    /**
     * @brief Return the root generator node.
     */
    GeneratorNode& getRootNode();

    virtual void generateChunk(Chunk &chunk) override;
    virtual GeneratorNode getWeatherGenNode() override;
};

#endif