using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;

namespace VibeCopilot.Editor
{
    // Incarca fonturile bundle-uite (design "Midnight"): Space Grotesk (sans) + JetBrains Mono (mono).
    // Mono = logo-wordmark, etichete majuscule, cod. Sans = tot restul textului.
    // Fisierele .ttf stau in Assets/VibeCopilot/Fonts/ si sunt importate automat de Unity ca Font.
    // Daca un font inca nu-i importat (Load intoarce null), apelantii cad elegant pe fontul default.
    internal static class VibeFonts
    {
        private const string Dir = "Assets/VibeCopilot/Fonts/";
        private static Font _sansReg, _sansMed, _sansBold, _monoReg, _monoMed, _monoSemi, _monoBold;
        private static bool _loaded;

        private static Font Load(string file) { return AssetDatabase.LoadAssetAtPath<Font>(Dir + file); }

        private static void EnsureLoaded()
        {
            if (_loaded) return;
            _loaded = true;
            _sansReg  = Load("SpaceGrotesk-Regular.ttf");
            _sansMed  = Load("SpaceGrotesk-Medium.ttf");
            _sansBold = Load("SpaceGrotesk-Bold.ttf");
            _monoReg  = Load("JetBrainsMono-Regular.ttf");
            _monoMed  = Load("JetBrainsMono-Medium.ttf");
            _monoSemi = Load("JetBrainsMono-SemiBold.ttf");
            _monoBold = Load("JetBrainsMono-Bold.ttf");
        }

        // Greutati (cad pe cea mai apropiata daca lipseste fisierul).
        public static Font SansRegular  { get { EnsureLoaded(); return _sansReg; } }
        public static Font SansMedium   { get { EnsureLoaded(); return _sansMed ?? _sansReg; } }
        public static Font SansBold     { get { EnsureLoaded(); return _sansBold ?? _sansMed ?? _sansReg; } }
        public static Font MonoRegular  { get { EnsureLoaded(); return _monoReg; } }
        public static Font MonoMedium   { get { EnsureLoaded(); return _monoMed ?? _monoReg; } }
        public static Font MonoSemiBold { get { EnsureLoaded(); return _monoSemi ?? _monoMed ?? _monoReg; } }
        public static Font MonoBold     { get { EnsureLoaded(); return _monoBold ?? _monoSemi ?? _monoReg; } }

        // Aplica un font pe un element. Ignora daca fontul lipseste (inca neimportat).
        public static void Set(VisualElement ve, Font f)
        {
            if (ve == null || f == null) return;
            ve.style.unityFontDefinition = FontDefinition.FromFont(f);
        }
    }
}
