namespace Kompas.Mcp.Core.Drawings;

/// <summary>
/// Поле основной надписи (графа штампа ГОСТ). Маппится на номер графы <c>ksStampEnum</c>.
/// Пока поддержаны три ключевые графы; остальные (масштаб, разработал, даты…) — позже.
/// </summary>
public enum StampField
{
    /// <summary>Обозначение документа (графа 2, ksStDescription).</summary>
    Designation,
    /// <summary>Наименование изделия (графа 1, ksStPartNumber).</summary>
    Name,
    /// <summary>Материал (графа 3, ksStMaterial).</summary>
    Material,
}

/// <summary>Маппинг поля основной надписи → номер графы и сбор непустых полей.</summary>
public static class StampFields
{
    /// <summary>Номер графы (<c>ksStampEnum</c>) для поля основной надписи.</summary>
    public static int ColumnId(StampField field) => field switch
    {
        StampField.Designation => 2, // ksStDescription
        StampField.Name => 1,         // ksStPartNumber (наименование изделия)
        StampField.Material => 3,     // ksStMaterial
        _ => throw new ArgumentOutOfRangeException(nameof(field), field, "Неизвестное поле основной надписи."),
    };

    /// <summary>
    /// Собрать непустые (после Trim) поля в список (номер графы, текст). null/пусто/пробелы —
    /// пропускаются. Чистая (без COM) — unit-тестируемо.
    /// </summary>
    public static IReadOnlyList<(int ColumnId, string Text)> Collect(string? designation, string? name, string? material)
    {
        var list = new List<(int, string)>(3);
        Add(list, StampField.Designation, designation);
        Add(list, StampField.Name, name);
        Add(list, StampField.Material, material);
        return list;
    }

    private static void Add(List<(int, string)> list, StampField field, string? value)
    {
        if (!string.IsNullOrWhiteSpace(value))
            list.Add((ColumnId(field), value.Trim()));
    }
}
