namespace Kompas.Mcp.Core.Conversion;

/// <summary>Вариант стандарта STEP для экспорта.</summary>
public enum StepFormat
{
    /// <summary>Формат по умолчанию (ksConverterToSTEP).</summary>
    Auto,
    Ap203,
    Ap214,
    Ap242,
}

/// <summary>
/// Маппинг формата STEP в целочисленные коды конвертера КОМПАС (<c>ksKOMPASConverterEnum</c>).
/// Эти коды передаются в <c>IApplication.get_Converter</c> и <c>IAdditionConvertParameters.Format</c>.
/// </summary>
public static class StepFormats
{
    /// <summary>Код импорта STEP — <c>ksConverterFromSTEP</c>.</summary>
    public const int ImportConverterCode = -3;

    /// <summary>Код экспорта STEP для выбранного стандарта (<c>ksConverterToSTEP[_APxxx]</c>).</summary>
    public static int ExportConverterCode(StepFormat format) => format switch
    {
        StepFormat.Auto => 3,
        StepFormat.Ap203 => 203,
        StepFormat.Ap214 => 214,
        StepFormat.Ap242 => 242,
        _ => throw new ArgumentOutOfRangeException(nameof(format), format, "Неизвестный формат STEP."),
    };

    /// <summary>Разобрать строку формата ("auto"/"step", "ap203", "ap214", "ap242").</summary>
    public static StepFormat Parse(string? value) => value?.Trim().ToLowerInvariant() switch
    {
        null or "" or "auto" or "step" => StepFormat.Auto,
        "ap203" or "203" => StepFormat.Ap203,
        "ap214" or "214" => StepFormat.Ap214,
        "ap242" or "242" => StepFormat.Ap242,
        _ => throw new ArgumentException(
            $"Неизвестный формат STEP '{value}'. Допустимо: auto, ap203, ap214, ap242.", nameof(value)),
    };
}
