using System;
using UnityEngine;

namespace MJGameSDK
{
    /// <summary>
    /// MJGameSDK 主入口，游戏通过此类接入平台能力。
    /// </summary>
    public static class MJGameSDK
    {
        public static MJGameAuth Auth { get; private set; }
        public static MJGameIAP IAP { get; private set; }
        public static MJGameAnalytics Analytics { get; private set; }
        public static MJGameUser User { get; private set; }
        public static MJGameLegal Legal { get; private set; }

        public static bool IsInitialized { get; private set; }
        public static MJGameConfig Config { get; private set; }

        private static MJGameHttpClient _httpClient;
        private static MJGameSteamManager _steamManager;
        private static MonoBehaviour _runner;

        /// <summary>
        /// 初始化 SDK。需在场景中使用 MJGameSDKRunner 组件，或传入 runner。
        /// </summary>
        public static void Initialize(MJGameConfig config, Action<MJGameResult> onComplete, MonoBehaviour runner = null)
        {
            if (IsInitialized)
            {
                onComplete?.Invoke(MJGameResult.Success("SDK already initialized"));
                return;
            }

            Config = config ?? MJGameConfig.LoadDefault();
            _runner = runner ?? MJGameSDKRunner.Instance;

            if (_runner == null)
            {
                var go = new GameObject("MJGameSDKRunner");
                UnityEngine.Object.DontDestroyOnLoad(go);
                _runner = go.AddComponent<MJGameSDKRunner>();
            }

            MJGameLogger.Initialize(Config.logLevel, Config.enableFileLog);
            MJGameClientContext.Initialize(Config.appId);
            MJGameLogger.Info("MJGameSDK", $"Initializing SDK v{MJGameSDKVersion.Version}, appId={Config.appId}");

            _httpClient = new MJGameHttpClient(Config.serverBaseUrl, Config.requestTimeout);
            _steamManager = new MJGameSteamManager(Config);

            Auth = new MJGameAuth(_httpClient, _steamManager);
            IAP = new MJGameIAP(_httpClient, _steamManager);
            Analytics = new MJGameAnalytics(_httpClient);
            User = new MJGameUser(_httpClient);
            Legal = new MJGameLegal(_httpClient, Config);

            _steamManager.Initialize(_runner, result =>
            {
                if (result.IsSuccess)
                {
                    IsInitialized = true;
                    MJGameLogger.Info("MJGameSDK", "SDK initialized successfully");
                }
                else
                {
                    MJGameLogger.Error("MJGameSDK", $"SDK init failed: {result.Message}");
                }
                onComplete?.Invoke(result);
            });
        }

        internal static MJGameHttpClient Http => _httpClient;
        internal static MJGameSteamManager Steam => _steamManager;
        internal static MonoBehaviour Runner => _runner;

        /// <summary>
        /// 设置 Access Token（登录成功后自动设置，也可手动设置用于重进游戏）
        /// </summary>
        public static void SetAccessToken(string token)
        {
            _httpClient?.SetAccessToken(token);
        }

        internal static void SetUserId(int userId)
        {
            _httpClient?.SetUserId(userId);
        }

        public static string GetAccessToken()
        {
            return _httpClient?.AccessToken;
        }

        /// <summary>
        /// 重置 SDK 状态（Demo/测试用，模拟游戏重启）
        /// </summary>
        public static void Shutdown()
        {
            _steamManager?.Shutdown();
            IsInitialized = false;
            Auth = null;
            IAP = null;
            Analytics = null;
            User = null;
            Legal = null;
            _httpClient = null;
            _steamManager = null;
            MJGameAuthSession.Clear();
            MJGameClientContext.Reset();
            MJGameLogger.Info("MJGameSDK", "SDK shutdown");
        }
    }
}
