using Kompas6Constants;

namespace Kompas.Mcp.Core.Drawings;

/// <summary>Направление полки выноски (обёртка над <see cref="ksShelfDirectionEnum"/>).</summary>
public enum ShelfDirection
{
    /// <summary>Авто — направление полки оставляет КОМПАС (свойство не задаётся).</summary>
    Auto,
    /// <summary>Полка вправо (в ЛОКАЛЬНОЙ СК вида).</summary>
    Right,
    /// <summary>Полка влево (в ЛОКАЛЬНОЙ СК вида).</summary>
    Left,
    /// <summary>Полка вверх (в ЛОКАЛЬНОЙ СК вида).</summary>
    Up,
    /// <summary>Полка вниз (в ЛОКАЛЬНОЙ СК вида).</summary>
    Down,
}

/// <summary>Маппинг направления полки ↔ перечисление КОМПАС и разбор строки.</summary>
public static class ShelfDirections
{
    /// <summary>В <see cref="ksShelfDirectionEnum"/>. Бросает на <see cref="ShelfDirection.Auto"/> —
    /// «авто» обрабатывается в сервисе (свойство не задаётся), сюда передавать нельзя.</summary>
    public static ksShelfDirectionEnum ToKompas(ShelfDirection direction) => direction switch
    {
        ShelfDirection.Right => ksShelfDirectionEnum.ksLSRight,
        ShelfDirection.Left => ksShelfDirectionEnum.ksLSLeft,
        ShelfDirection.Up => ksShelfDirectionEnum.ksLSUp,
        ShelfDirection.Down => ksShelfDirectionEnum.ksLSDown,
        _ => throw new ArgumentOutOfRangeException(nameof(direction), direction,
            "ShelfDirection.Auto не имеет COM-значения (направление не задаётся)."),
    };

    /// <summary>Разобрать строку направления (англ./рус., регистр/пробелы) в <see cref="ShelfDirection"/>.</summary>
    public static ShelfDirection Parse(string value)
    {
        ArgumentNullException.ThrowIfNull(value);
        return value.Trim().ToLowerInvariant() switch
        {
            "auto" or "авто" => ShelfDirection.Auto,
            "right" or "вправо" => ShelfDirection.Right,
            "left" or "влево" => ShelfDirection.Left,
            "up" or "вверх" => ShelfDirection.Up,
            "down" or "вниз" => ShelfDirection.Down,
            _ => throw new ArgumentException(
                $"Неизвестное направление полки '{value}'. Допустимо: auto/авто, right/вправо, " +
                "left/влево, up/вверх, down/вниз.",
                nameof(value)),
        };
    }
}
