namespace Theriapolis.Core.World;

/// <summary>
/// Per-tile data for a single world tile (1/1024 of the continent's width).
/// All float fields are normalized to [0, 1] unless noted.
/// </summary>
public struct WorldTile
{
    public float     Elevation;     // 0 = sea floor, 1 = mountain peak
    public float     Moisture;      // 0 = arid, 1 = saturated
    public float     Temperature;   // 0 = polar, 1 = equatorial
    public BiomeId   Biome;
    public FeatureFlags Features;

    /// <summary>Macro-grid cell index (x + y*32) for this tile.</summary>
    public byte MacroX;
    public byte MacroY;

    // ── Phase 2+3 additions ──────────────────────────────────────────────────
    /// <summary>
    /// Direction (Dir.N..Dir.NW, or Dir.None) that a river polyline flows through this tile.
    /// Set by HydrologyGenStage when rasterizing river polylines.
    /// </summary>
    public byte RiverFlowDir;

    /// <summary>
    /// Direction (Dir.N..Dir.NW, or Dir.None) that a rail polyline passes through this tile.
    /// Set by RailNetworkGenStage when rasterizing rail polylines.
    /// </summary>
    public byte RailDir;

    /// <summary>
    /// Settlement ID (1-based) of the settlement whose footprint covers this tile.
    /// 0 = no settlement.
    /// </summary>
    public ushort SettlementId;
}

/// <summary>
/// Biome identifiers. Enums, not magic ints.
/// </summary>
public enum BiomeId : byte
{
    None = 0,
    Ocean,
    Tundra,
    Boreal,
    TemperateDeciduous,
    TemperateGrassland,
    MountainAlpine,
    MountainForested,
    SubtropicalForest,
    Wetland,
    Coastal,
    RiverValley,
    Scrubland,
    DesertCold,

    // Transition biomes (assigned by BorderDistortionGen)
    ForestEdge,
    Foothills,
    MarshEdge,
    Beach,
    Cliff,
    TidalFlat,
    Mangrove,
}

/// <summary>
/// Bitmask of linear and special features on a tile.
/// Per-tile flags are derived caches — polylines are the source of truth for rivers/roads/rail.
/// </summary>
[Flags]
public enum FeatureFlags : ushort
{
    None        = 0,
    HasRiver    = 1 << 0,
    HasRoad     = 1 << 1,
    HasRail     = 1 << 2,
    IsSettlement = 1 << 3,
    IsPoi       = 1 << 4,
    IsCoast     = 1 << 5,
    IsBorder    = 1 << 6,   // biome or land/ocean border (set during distortion pass)
    RiverAdjacent   = 1 << 7,
    RailroadAdjacent = 1 << 8,
}
