namespace EDPlayerJournal.PowerPlay;

/// <summary>
/// Holds a list of all available powers in E:D, and helps
/// to translate commonly used short-hands and aliases to
/// journal approved power names.
/// </summary>
public class Powers {
    public static readonly string
        // Basking
        ALavignyDuval = "A. Lavigny-Duval",
        AislingDuval = "Aisling Duval",
        DentonPatreus = "Denton Patreus",
        ZeminaTorval = "Zemina Torval",
        // Feds
        JeromeArcher = "Jerome Archer",
        FeliciaWinters = "Felicia Winters",
        // Alliance
        EdmunMahon = "Edmund Mahon",
        NakatoKaine = "Nakato Kaine",
        // Independents
        YuriGrom = "Yuri Grom",
        ArchonDelaine = "Archon Delaine",
        LiYongRui = "Li Yong-Rui",
        PranavAntal = "Pranav Antal"
        ;

    public static readonly Dictionary<string, string> aliases = new() {
        // ALD
        { Powers.ALavignyDuval, Powers.ALavignyDuval },
        { "ALD", Powers.ALavignyDuval },
        { "Arissa", Powers.ALavignyDuval },
        { "Emperor", Powers.ALavignyDuval },
        { "Kaiser", Powers.ALavignyDuval },
        // AD
        { Powers.AislingDuval, Powers.AislingDuval },
        { "AD", Powers.AislingDuval },
        { "Aisling", Powers.AislingDuval },
        // DP
        { Powers.DentonPatreus, Powers.DentonPatreus },
        { "DP", Powers.DentonPatreus },
        { "Denton", Powers.DentonPatreus },
        // ZT
        { Powers.ZeminaTorval, Powers.ZeminaTorval },
        { "ZT", Powers.ZeminaTorval },
        { "Torval", Powers.ZeminaTorval },
        // Archer
        { Powers.JeromeArcher, Powers.JeromeArcher },
        { "JA", Powers.JeromeArcher },
        { "Archer", Powers.JeromeArcher },
        // Winters
        { Powers.FeliciaWinters, Powers.FeliciaWinters },
        { "FW", Powers.FeliciaWinters },
        { "Winters", Powers.FeliciaWinters },
        // Mahon
        { Powers.EdmunMahon, Powers.EdmunMahon },
        { "EM", Powers.EdmunMahon },
        { "Mahon", Powers.EdmunMahon },
        // Kaine
        { Powers.NakatoKaine, Powers.NakatoKaine },
        { "NK", Powers.NakatoKaine },
        { "Kaine", Powers.NakatoKaine },
        // Grom
        { Powers.YuriGrom, Powers.YuriGrom },
        { "YG", Powers.YuriGrom },
        { "Grom", Powers.YuriGrom },
        // Archon
        { Powers.ArchonDelaine, Powers.ArchonDelaine },
        { "Archon", Powers.ArchonDelaine },
        { "Kumo", Powers.ArchonDelaine },
        { "KumoBurger", Powers.ArchonDelaine },
        // LYR
        { Powers.LiYongRui, Powers.LiYongRui },
        { "LYR", Powers.LiYongRui },
        // Pranav
        { Powers.PranavAntal, Powers.PranavAntal },
        { "PA", Powers.PranavAntal },
        { "Pranav", Powers.PranavAntal },
    };

    public static bool IsValidPower(string power) {
        try {
            string p = GetPower(power);
            return true;
        } catch (Exception) {
            return false;
        }
    }

    public static string GetPower(string nameOrAlias) {
        string? val = aliases
            .Where(x => string.Compare(x.Key, nameOrAlias, StringComparison.InvariantCultureIgnoreCase) == 0)
            .Select(x => x.Value)
            .FirstOrDefault()
            ;
        if (string.IsNullOrEmpty(val)) {
            throw new ApplicationException($"not a valid power: {nameOrAlias}");
        }
        return val;
    }
}