using System.Globalization;
using System.Numerics;
using LightlessSync.LightlessConfiguration;

namespace LightlessSync.UI
{
    internal static class UIColors
    {
        private static readonly Dictionary<string, string> DefaultHexColors = new(StringComparer.OrdinalIgnoreCase)
        {
            { "LightlessPurple", "#ad8af5" },
            { "LightlessPurpleActive", "#be9eff" },
            { "LightlessPurpleDefault", "#9375d1" },
            { "ButtonDefault", "#323232" },
            { "FullBlack", "#000000" },
            { "LightlessBlue", "#a6c2ff" },
            { "LightlessYellow", "#ffe97a" },
            { "LightlessYellow2", "#cfbd63" },
            { "LightlessGreen", "#7cd68a" },
            { "LightlessGreenDefault", "#468a50" },
            { "LightlessOrange", "#ffb366" },
            { "LightlessGrey", "#8f8f8f" },
            { "PairBlue", "#88a2db" },
            { "DimRed", "#d44444" },
            { "LightlessAdminText", "#ffd663" },
            { "LightlessAdminGlow", "#b09343" },
            { "LightlessModeratorText", "#94ffda" },

            { "Lightfinder", "#ad8af5" },
            { "LightfinderEdge", "#000000" },

            { "ProfileBodyGradientTop", "#2f283fff" },
            { "ProfileBodyGradientBottom", "#372d4d00" },
        };

        private static LightlessConfigService? _configService;

        public static void Initialize(LightlessConfigService configService)
        {
            _configService = configService;
        }

        public static Vector4 Get(string name)
        {
            if (_configService?.Current.CustomUIColors.TryGetValue(name, out var customColorHex) == true)
                return HexToRgba(customColorHex);

            if (!DefaultHexColors.TryGetValue(name, out var hex))
                throw new ArgumentException($"Color '{name}' not found in UIColors.", nameof(name));

            return HexToRgba(hex);
        }

        public static void Set(string name, Vector4 color)
        {
            if (!DefaultHexColors.ContainsKey(name))
                throw new ArgumentException($"Color '{name}' not found in UIColors.", nameof(name));

            if (_configService != null)
            {
                _configService.Current.CustomUIColors[name] = RgbaToHex(color);
                _configService.Save();
            }
        }

        public static void Reset(string name)
        {
            if (_configService != null)
            {
                _configService.Current.CustomUIColors.Remove(name);
                _configService.Save();
            }
        }

        public static void ResetAll()
        {
            if (_configService != null)
            {
                _configService.Current.CustomUIColors.Clear();
                _configService.Save();
            }
        }

        public static Vector4 GetDefault(string name)
        {
            if (!DefaultHexColors.TryGetValue(name, out var hex))
                throw new ArgumentException($"Color '{name}' not found in UIColors.", nameof(name));

            return HexToRgba(hex);
        }

        public static bool IsCustom(string name)
        {
            return _configService?.Current.CustomUIColors.ContainsKey(name) == true;
        }

        public static IEnumerable<string> GetColorNames()
        {
            return DefaultHexColors.Keys;
        }

        public static Vector4 HexToRgba(string hexColor)
        {
            hexColor = hexColor.TrimStart('#');
            int r = int.Parse(hexColor[..2], NumberStyles.HexNumber);
            int g = int.Parse(hexColor[2..4], NumberStyles.HexNumber);
            int b = int.Parse(hexColor[4..6], NumberStyles.HexNumber);
            int a = hexColor.Length == 8 ? int.Parse(hexColor[6..8], NumberStyles.HexNumber) : 255;
            return new Vector4(r / 255f, g / 255f, b / 255f, a / 255f);
        }

        public static string RgbaToHex(Vector4 color)
        {
            int r = (int)(color.X * 255);
            int g = (int)(color.Y * 255);
            int b = (int)(color.Z * 255);
            int a = (int)(color.W * 255);
            return $"#{r:X2}{g:X2}{b:X2}{(a != 255 ? a.ToString("X2") : "")}";
        }
    }
}