#pragma once

#include <deque>
#include <vector>

#include "Building.h"
#include "BuildingGrid.h"
#include "BuildingId.h"
#include "ItemType.h"
#include "Tick.h"

// One pending demolition of a fully-built building (REQ-BLD-DECON-QUEUE).
// completesAt == 0 means "queued but its timer has not started yet"
// (mirrors ConstructionSite). For a Splitter, the filters it had are captured
// here so cancelDeconstruction can restore them on re-registration.
struct DeconstructionEntry
{
    BuildingId            id          = kInvalidBuildingId;
    Tick                  completesAt = 0;
    std::vector<ItemType> splitterFilterA;
    std::vector<ItemType> splitterFilterB;
};

// The factory's world data: every building, the work queued on them, and the
// tile ownership index. This is the buildings-side counterpart to EntityAdmin —
// data with no behaviour of its own beyond what BuildingGrid encapsulates.
//
// Buildings deliberately stay a plain vector rather than becoming EnTT entities
// (see docs/architecture.md). Separating this data from the systems that operate
// on it is not a step toward putting them in the entity model; it is the same
// data/behaviour split the ecs/system/ classes already follow, where world data
// arrives as a tick argument instead of being owned by the system.
//
// Owned by BuildingSystem for now. The intent is to hand ownership to Simulation
// and pass this into the tick methods, so the systems become stateless over it.
struct FactoryState
{
    std::vector<Building>           buildings;
    std::deque<ConstructionSite>    constructionQueue;
    std::deque<DeconstructionEntry> deconstructionQueue;

    // The authority on which building owns which tile; every placement and removal
    // path claims and releases its body cells here.
    BuildingGrid                    grid;
};
