using Kompas6Constants;

namespace Kompas.Mcp.Core.Drawings;

/// <summary>Формат листа чертежа (обёртка над <see cref="ksDocumentFormatEnum"/>).</summary>
public enum PaperFormat
{
    /// <summary>A0 (841×1189 мм).</summary>
    A0,
    /// <summary>A1 (594×841 мм).</summary>
    A1,
    /// <summary>A2 (420×594 мм).</summary>
    A2,
    /// <summary>A3 (297×420 мм).</summary>
    A3,
    /// <summary>A4 (210×297 мм).</summary>
    A4,
    /// <summary>A5 (148×210 мм).</summary>
    A5,
    /// <summary>Пользовательский формат с явной шириной/высотой.</summary>
    User,
}

/// <summary>Маппинг формата листа ↔ перечисление КОМПАС и разбор строки.</summary>
public static class PaperFormats
{
    public static ksDocumentFormatEnum ToKompas(PaperFormat format) => format switch
    {
        PaperFormat.A0 => ksDocumentFormatEnum.ksFormatA0,
        PaperFormat.A1 => ksDocumentFormatEnum.ksFormatA1,
        PaperFormat.A2 => ksDocumentFormatEnum.ksFormatA2,
        PaperFormat.A3 => ksDocumentFormatEnum.ksFormatA3,
        PaperFormat.A4 => ksDocumentFormatEnum.ksFormatA4,
        PaperFormat.A5 => ksDocumentFormatEnum.ksFormatA5,
        PaperFormat.User => ksDocumentFormatEnum.ksFormatUser,
        _ => throw new ArgumentOutOfRangeException(nameof(format), format, "Неизвестный формат листа."),
    };

    /// <summary>Обратный маппинг (для read-back дружелюбного имени).</summary>
    public static PaperFormat FromKompas(ksDocumentFormatEnum format) => format switch
    {
        ksDocumentFormatEnum.ksFormatA0 => PaperFormat.A0,
        ksDocumentFormatEnum.ksFormatA1 => PaperFormat.A1,
        ksDocumentFormatEnum.ksFormatA2 => PaperFormat.A2,
        ksDocumentFormatEnum.ksFormatA3 => PaperFormat.A3,
        ksDocumentFormatEnum.ksFormatA4 => PaperFormat.A4,
        ksDocumentFormatEnum.ksFormatA5 => PaperFormat.A5,
        ksDocumentFormatEnum.ksFormatUser => PaperFormat.User,
        _ => throw new ArgumentOutOfRangeException(nameof(format), format, "Неизвестный формат листа КОМПАС."),
    };

    /// <summary>Разобрать строку формата (A0..A5 / user, регистр/пробелы) в <see cref="PaperFormat"/>.</summary>
    public static PaperFormat Parse(string value)
    {
        ArgumentNullException.ThrowIfNull(value);
        return value.Trim().ToLowerInvariant() switch
        {
            "a0" => PaperFormat.A0,
            "a1" => PaperFormat.A1,
            "a2" => PaperFormat.A2,
            "a3" => PaperFormat.A3,
            "a4" => PaperFormat.A4,
            "a5" => PaperFormat.A5,
            "user" or "custom" or "пользовательский" => PaperFormat.User,
            _ => throw new ArgumentException(
                $"Неизвестный формат листа '{value}'. Допустимо: A0, A1, A2, A3, A4, A5, user.",
                nameof(value)),
        };
    }
}
