#pragma once
#include "render/Renderer.h"
#include "PlanetData.h"

namespace ZL {

    struct StoneParams
    {
        static const float BASE_SCALE;          // Общий размер камня
        static const float MIN_AXIS_SCALE;      // Минимальное растяжение/сжатие по оси
        static const float MAX_AXIS_SCALE;      // Максимальное растяжение/сжатие по оси
        static const float MIN_PERTURBATION;   // Минимальное радиальное возмущение вершины
        static const float MAX_PERTURBATION;  // Максимальное радиальное возмущение вершины
        static const int STONES_PER_TRIANGLE;

    };

    struct StoneInstance {
        uint64_t seed;
        Vector3f position;
        Vector3f scale;
        Eigen::Quaternionf rotation;
    };

    enum class ChunkStatus {
        Empty,          // Данных нет
        Generating,     // Задача в TaskManager (CPU)
        ReadyToUpload,  // Данные в памяти, ждут очереди в главный поток
        Live            // Загружено в GPU и готово к отрисовке
    };

    struct StoneGroup {
        // mesh.PositionData и прочие будут заполняться в inflate()
        VertexDataStruct mesh;

        std::vector<std::vector<StoneInstance>> allInstances;

        // Очищает старую геометрию и генерирует новую для указанных индексов
        std::vector<VertexRenderStruct> inflate(int count);

        VertexRenderStruct inflateOne(int index, float scaleModifier);
        VertexDataStruct inflateOneDataOnly(int index, float scaleModifier);

        std::vector<ChunkStatus> statuses;

        // Инициализация статусов при создании группы
        void initStatuses() {
            statuses.assign(allInstances.size(), ChunkStatus::Empty);
        }
    };

    // Теперь возвращает заготовку со всеми параметрами, но без тяжелого меша
    StoneGroup CreateStoneGroupData(uint64_t globalSeed, const LodLevel& lodLevel);

    Triangle createLocalTriangle(const Triangle& sampleTri);

} // namespace ZL
