//using Anata.Logger;

using AyCode.Core.Enums;
using Microsoft.Extensions.Configuration;

namespace AyCode.Core.Consts
{
    //TODO: Adatbázisból kéne a környezeti beállításokat - J.
    public static class AcEnv
    {
        /// <summary>
        /// Environment.NewLine
        /// </summary>
        // ReSharper disable once InconsistentNaming
        public static string NL => Environment.NewLine;

        //public static AppModeType AppModeServer = AppModeType.Trace;
        ////Elküldeni a kliens-nek, így szerver oldalról tudjuk szabályozni...
        //public static AppModeType AppModeClient = AppModeType.Trace;

        //public static LogLevel LogLevel = LogLevel.Detail;

        public static ulong MaxLogItemsPerSession = 250;

        /// <summary>
        /// A szerver base URL-je (pl. "https://localhost:59579") — a kliens-hostok hidratálják induláskor
        /// a configból (konvenció: "AyCode:Urls:BaseUrl"). A hub-/link-URL-ek EBBŐL az egy értékből származnak.
        /// Fail-fast: hidratálatlan olvasás exception — hiányzó/rossz URL-lel nem megyünk tovább csendben.
        /// </summary>
        private static string? _baseUrl;
        public static string BaseUrl
        {
            get => !string.IsNullOrWhiteSpace(_baseUrl) ? _baseUrl : throw new InvalidOperationException("AcEnv.BaseUrl nincs beállítva — a host indulásakor hidratáld a configból (konvenció: 'AyCode:Urls:BaseUrl').");
            set => _baseUrl = value;
        }

        /// <summary>
        /// A szerver ADAT-környezete: a mögöttes adatbázis PROD-e. FIGYELEM: NEM build-konfiguráció (Debug/Release)
        /// és NEM hosting-környezet (ASPNETCORE_ENVIRONMENT) — három független tengely; ez az adat-tengely.
        /// Forrás: a szerver a DB-katalógusából sorolja be magát (fail-closed); a kliens tükrözi (kapcsolat-felépüléskor
        /// a szerver env-válaszából + push-on-connect announce). Fail-fast: hidratálatlan olvasás exception.
        /// </summary>
        private static bool? _isProdDb;
        public static bool IsProdDb
            => _isProdDb ?? throw new InvalidOperationException(
                "AcEnv.IsProdDb nincs hidratálva — a szerver a DB-katalógusból tölti induláskor; a kliens a kapcsolat felépülésekor a szerver env-válaszából.");

        /// <summary>True, ha az IsProdDb már hidratált — kapu-logikához (első-connect await) és a push-összevetéshez.</summary>
        public static bool IsProdDbHydrated => _isProdDb != null;

        /// <summary>Csak TÉNYLEGES változáskor tüzel (első hidratálás + announce-detektált env-váltás) —
        /// a megjelenítők (title-badge, UI-sáv) feliratkozási pontja.</summary>
        public static event Action<bool>? IsProdDbChanged;

        public static void SetIsProdDb(bool isProdDb)
        {
            var changed = _isProdDb != isProdDb;
            _isProdDb = isProdDb;

            if (changed) IsProdDbChanged?.Invoke(isProdDb);
        }

        private static IConfiguration? _appConfiguration = null;
        public static IConfiguration AppConfiguration => _appConfiguration ??= GetAppSettingsConfiguration();

        public static TEnum GetEnum<TEnum>(this IConfiguration configuration, string configPath) where TEnum : struct
            => (TEnum)Enum.Parse(typeof(TEnum), configuration[configPath]);

        public static TEnum GetEnum<TEnum>(this IConfigurationSection section, string configPath) where TEnum : struct
            => (TEnum)Enum.Parse(typeof(TEnum), section[configPath]);

        private static IConfiguration GetAppSettingsConfiguration(string appSettingsFileName = "appsettings.json")
        {
            var config = new ConfigurationBuilder()
                .AddJsonFile(appSettingsFileName)
                .AddEnvironmentVariables() 
                .Build();

            return config;
        }

    }
}