using System.Collections.Generic;
using static PKHeX.Core.EReaderBerryMatch;

namespace PKHeX.Core
{
    /// <summary>
    /// Stores details about the Gen3 e-Reader Berry values.
    /// </summary>
    public static class EReaderBerrySettings
    {
        /// <summary> e-Reader Berry is Enigma or special berry (from e-Reader data)</summary>
        public static bool IsEnigma { get; set; } = true;

        /// <summary> e-Reader Berry Name </summary>
        private static string Name { get; set; } = string.Empty;

        /// <summary> e-Reader Berry Name formatted in Title Case </summary>
        public static string DisplayName => string.Format(LegalityCheckStrings.L_XEnigmaBerry_0, Util.ToTitleCase(Name));

        private static int Language { get; set; }

        /// <summary>
        /// Checks if the most recently loaded Generation 3 Save File has a proper Enigma Berry that matches known distributions.
        /// </summary>
        public static EReaderBerryMatch GetStatus()
        {
            if (IsEnigma) // no e-Reader Berry data provided, can't hold berry.
                return NoData;

            var name = Name;
            if (EReaderBerriesNames_USA.Contains(name))
            {
                return Language switch
                {
                    <= 0 => ValidAny,
                    not 1 => ValidUSA,
                    _ => InvalidUSA,
                };
            }
            if (EReaderBerriesNames_JP.Contains(name))
            {
                return Language switch
                {
                    <= 0 => ValidAny,
                    1 => ValidJPN,
                    _ => InvalidJPN,
                };
            }
            return NoMatch;
        }

        private static readonly HashSet<string> EReaderBerriesNames_USA = new()
        {
            // USA Series 1
            "PUMKIN",
            "DRASH",
            "EGGANT",
            "STRIB",
            "CHILAN",
            "NUTPEA",
        };

        private static readonly HashSet<string> EReaderBerriesNames_JP = new()
        {
            // JP Series 1
            "カチャ", // PUMKIN
            "ブ－カ", // DRASH
            "ビスナ", // EGGANT
            "エドマ", // STRIB
            "ホズ", // CHILAN
            "ラッカ", // NUTPEA
            "クオ", // KU
            // JP Series 2
            "ギネマ", // GINEMA
            "クオ", // KUO
            "ヤゴ", // YAGO
            "トウガ", // TOUGA
            "ニニク", // NINIKU
            "トポ", // TOPO
        };

        public static void LoadFrom(SAV3 sav3)
        {
            Language = sav3.Japanese ? (int)LanguageID.Japanese : (int)LanguageID.English;
            if (sav3.IsEBerryEngima)
            {
                IsEnigma = true;
                Name = string.Empty;
            }
            else
            {
                IsEnigma = false;
                Name = sav3.EBerryName;
            }
        }
    }

    /// <summary>
    /// For use in validating the current e-Reader Berry settings.
    /// </summary>
    public enum EReaderBerryMatch : byte
    {
        /// <summary> Invalid: Doesn't match either language </summary>
        NoMatch,
        /// <summary> Invalid: No data provided from a save file </summary>
        NoData,
        /// <summary> Invalid: USA berry name on JPN save file </summary>
        InvalidUSA,
        /// <summary> Invalid: JPN berry name on USA save file</summary>
        InvalidJPN,

        /// <summary> Valid: Berry name matches either USA/JPN (Ambiguous Save File Language) </summary>
        ValidAny,
        /// <summary> Valid: Berry name matches a USA berry name </summary>
        ValidUSA,
        /// <summary> Valid: Berry name matches a JPN berry name </summary>
        ValidJPN,
    }
}
