namespace SIGCM2.Domain.Fiscal;

/// <summary>
/// Jurisdicciones fiscales de Argentina: 23 provincias INDEC + Ciudad Autónoma de Buenos Aires.
/// Almacenado en BD como VARCHAR(50) (nombre del enum via ToString()).
/// </summary>
public enum ProvinciaArgentina
{
    BuenosAires,
    Catamarca,
    Chaco,
    Chubut,
    CiudadAutonomaDeBuenosAires,
    Cordoba,
    Corrientes,
    EntreRios,
    Formosa,
    Jujuy,
    LaPampa,
    LaRioja,
    Mendoza,
    Misiones,
    Neuquen,
    RioNegro,
    Salta,
    SanJuan,
    SanLuis,
    SantaCruz,
    SantaFe,
    SantiagoDelEstero,
    TierraDelFuego,
    Tucuman
}

/// <summary>
/// Extension methods para ProvinciaArgentina: mapping bidireccional con el display name
/// (nombre con acentos/espacios) que se usa para presentación en UI.
/// </summary>
public static class ProvinciaArgentinaExtensions
{
    private static readonly Dictionary<ProvinciaArgentina, string> DisplayNames = new()
    {
        [ProvinciaArgentina.BuenosAires] = "Buenos Aires",
        [ProvinciaArgentina.Catamarca] = "Catamarca",
        [ProvinciaArgentina.Chaco] = "Chaco",
        [ProvinciaArgentina.Chubut] = "Chubut",
        [ProvinciaArgentina.CiudadAutonomaDeBuenosAires] = "Ciudad Autónoma de Buenos Aires",
        [ProvinciaArgentina.Cordoba] = "Córdoba",
        [ProvinciaArgentina.Corrientes] = "Corrientes",
        [ProvinciaArgentina.EntreRios] = "Entre Ríos",
        [ProvinciaArgentina.Formosa] = "Formosa",
        [ProvinciaArgentina.Jujuy] = "Jujuy",
        [ProvinciaArgentina.LaPampa] = "La Pampa",
        [ProvinciaArgentina.LaRioja] = "La Rioja",
        [ProvinciaArgentina.Mendoza] = "Mendoza",
        [ProvinciaArgentina.Misiones] = "Misiones",
        [ProvinciaArgentina.Neuquen] = "Neuquén",
        [ProvinciaArgentina.RioNegro] = "Río Negro",
        [ProvinciaArgentina.Salta] = "Salta",
        [ProvinciaArgentina.SanJuan] = "San Juan",
        [ProvinciaArgentina.SanLuis] = "San Luis",
        [ProvinciaArgentina.SantaCruz] = "Santa Cruz",
        [ProvinciaArgentina.SantaFe] = "Santa Fe",
        [ProvinciaArgentina.SantiagoDelEstero] = "Santiago del Estero",
        [ProvinciaArgentina.TierraDelFuego] = "Tierra del Fuego",
        [ProvinciaArgentina.Tucuman] = "Tucumán",
    };

    private static readonly Dictionary<string, ProvinciaArgentina> ByDisplayName =
        DisplayNames.ToDictionary(kv => kv.Value, kv => kv.Key, StringComparer.Ordinal);

    /// <summary>
    /// Retorna el nombre con acentos/espacios para presentación en UI y almacenamiento en BD.
    /// </summary>
    public static string ToDisplayString(this ProvinciaArgentina provincia)
        => DisplayNames[provincia];

    /// <summary>
    /// Parsea un display name a su valor de enum correspondiente.
    /// Lanza <see cref="ArgumentException"/> si el nombre no corresponde a ningún valor.
    /// </summary>
    public static ProvinciaArgentina FromDisplayString(string displayName)
    {
        if (ByDisplayName.TryGetValue(displayName, out var result))
            return result;

        throw new ArgumentException(
            $"'{displayName}' no es un nombre de provincia válido. Usá uno de los valores de ProvinciaArgentina.",
            nameof(displayName));
    }
}
