namespace LittleSim.Content;

/// <summary>Дефы рельефа, отсортированные по порогу высоты: классификация клетки за один проход.</summary>
public sealed class TerrainSet
{
    private readonly TerrainDef[] _byHeight;

    /// <summary>Создаёт набор из дефов; пустой список — ошибка загрузки Core-мода.</summary>
    public TerrainSet(IReadOnlyList<TerrainDef> defs)
    {
        if (defs.Count == 0)
        {
            throw new InvalidDataException(
                "Не загружен ни один TerrainDef — отсутствует Core-мод?"
            );
        }

        _byHeight = defs.OrderBy(d => d.MaxHeight).ToArray();
    }

    /// <summary>Все дефы по возрастанию порога.</summary>
    public IReadOnlyList<TerrainDef> All => _byHeight;

    /// <summary>Деф клетки по высоте: первый, чей порог выше; выше всех порогов — последний.</summary>
    public TerrainDef Classify(float height)
    {
        foreach (var def in _byHeight)
        {
            if (height < def.MaxHeight)
            {
                return def;
            }
        }

        return _byHeight[^1];
    }
}
