using System;

namespace MJGameSDK
{
    public class MJGameAuth
    {
        private readonly MJGameHttpClient _http;
        private readonly MJGameSteamManager _steam;

        public MJGameUserInfo CurrentUser { get; private set; }
        public bool IsLoggedIn => CurrentUser != null && MJGameAuthSession.HasAccessToken;

        public MJGameAuth(MJGameHttpClient http, MJGameSteamManager steam)
        {
            _http = http;
            _steam = steam;
        }

        /// <summary>
        /// 使用 Steam 登录：获取 Web API Ticket → 服务端验票 → 返回 JWT + request_key。
        /// </summary>
        public void LoginWithSteam(Action<MJGameUserInfo> onSuccess, Action<MJGameResult> onError)
        {
            if (!_steam.IsInitialized)
            {
                onError?.Invoke(MJGameResult.Fail(2000, "Steam not initialized"));
                return;
            }

            _steam.GetAuthSessionTicket(
                ticket =>
                {
                    var body = new SteamLoginRequest
                    {
                        ticket = ticket,
                        steam_id = _steam.GetSteamId().ToString(),
                        persona_name = _steam.GetPersonaName()
                    };

                    _http.Post<SteamLoginResponse>("auth/steam/login", body,
                        response =>
                        {
                            var data = response.data;
                            MJGameAuthSession.ApplyLogin(
                                data.access_token,
                                data.refresh_token,
                                data.expires_in > 0 ? data.expires_in : 7200,
                                data.request_key,
                                data.request_key_expires_in > 0 ? data.request_key_expires_in : data.expires_in);

                            MJGameSDK.SetAccessToken(data.access_token);
                            MJGameSDK.SetUserId(data.user.id);
                            CurrentUser = data.user;
                            MJGameLogger.Info("Auth",
                                $"Login success: steamId={CurrentUser.steam_id}, nickname={CurrentUser.nickname}, request_key_ttl={data.request_key_expires_in}s");
                            onSuccess?.Invoke(CurrentUser);
                        },
                        onError);
                },
                onError);
        }

        public void Logout()
        {
            CurrentUser = null;
            MJGameAuthSession.Clear();
            MJGameSDK.SetAccessToken(null);
            MJGameLogger.Info("Auth", "Logged out");
        }
    }

    [Serializable]
    public class MJGameUserInfo
    {
        public int id;
        public int app_id;
        public ulong steam_app_id;
        public string steam_id;
        public string nickname;
        public string avatar_url;
    }

    [Serializable]
    public class SteamLoginRequest
    {
        public string ticket;
        public string steam_id;
        public string persona_name;
    }

    [Serializable]
    public class SteamLoginResponse : MJGameResponse
    {
        public SteamLoginData data;
    }

    [Serializable]
    public class SteamLoginData
    {
        public string access_token;
        public string refresh_token;
        public int expires_in;
        public string request_key;
        public int request_key_expires_in;
        public MJGameUserInfo user;
    }
}
