#nullable enable
using System;

namespace IGP.UnitySDK.Models
{
    /// <summary>
    /// Desktop session 登录用户上下文
    /// </summary>
    [Serializable]
    public class IGPDesktopUserContext
    {
        public string userId = string.Empty;
        public string accountId = string.Empty;
        public string loginState = string.Empty;
    }

    /// <summary>
    /// Desktop session 能力集合
    /// </summary>
    [Serializable]
    public class IGPDesktopCapabilitySet
    {
        public bool achievements;
        public bool userContext;
        public bool hostedBootstrap;
        public bool gameAuthorization;
        public bool antiAddiction;
        public bool lyingBottle;
    }

    /// <summary>
    /// Desktop session 当前登录用户资料
    /// </summary>
    [Serializable]
    public class IGPDesktopUserProfile
    {
        public string nickname = string.Empty;
        public string displayTag = string.Empty;
        public bool avatarAvailable;
        public string avatarVersion = string.Empty;
    }

    /// <summary>
    /// Desktop session 用户头像元信息
    /// </summary>
    [Serializable]
    public class IGPDesktopUserAvatarInfo
    {
        public bool available;
        public string contentType = string.Empty;
        public int width;
        public int height;
        public int encodedByteLength;
        public int decodedByteLength;
        public string avatarVersion = string.Empty;
    }

    /// <summary>
    /// Desktop session 用户头像 PNG 数据
    /// </summary>
    [Serializable]
    public class IGPDesktopUserAvatarImage
    {
        public IGPDesktopUserAvatarInfo info = new IGPDesktopUserAvatarInfo();
        public byte[] pngBytes = Array.Empty<byte>();
    }

    /// <summary>
    /// Desktop session 请求的授权验证结果
    /// </summary>
    [Serializable]
    public class IGPDesktopAuthorizationRequestResult
    {
        public bool authorizationRequired = true;
        public bool offlineMode;
        public string pipeName = string.Empty;
    }

    /// <summary>
    /// Desktop session 通知：当前运行中的游戏可以领取 hosted bootstrap。
    /// </summary>
    [Serializable]
    public class IGPDesktopHostedBootstrapAvailableEvent
    {
        public int appId;
        public string roomId = string.Empty;
    }

    /// <summary>
    /// Desktop session 补发的 hosted bootstrap 上下文。
    /// </summary>
    [Serializable]
    public class IGPDesktopHostedBootstrapContext
    {
        public string roomId = string.Empty;
        public int appId;
        public string launchTicket = string.Empty;
        public string bootstrapEndpoint = string.Empty;
        public string bootstrapSecret = string.Empty;
        public bool autoConnect = true;
        public string generatedAt = string.Empty;
    }

    /// <summary>
    /// 游戏内 IGP 账号登录与实名认证 WebView 入口
    /// </summary>
    [Serializable]
    public class IGPAntiAddictionRealNameWebSession
    {
        public string ticket = string.Empty;
        public string url = string.Empty;
        public string expiresAt = string.Empty;
    }

    [Serializable]
    public enum IGPAntiAddictionState
    {
        Disabled = 0,
        Allowed = 1,
        Blocked = 2,
        PendingRealName = 3,
        Verifying = 4,
        Failed = 5,
    }

    [Serializable]
    public enum IGPAgeBand
    {
        Unknown = 0,
        Under8 = 1,
        Age8To15 = 2,
        Age16To17 = 3,
        Adult = 4,
    }

    [Serializable]
    public class IGPAntiAddictionStatus
    {
        public bool enabled;
        public bool canPlayNow;
        public string state = nameof(IGPAntiAddictionState.Disabled);
        public string reasonCode = string.Empty;
        public string reasonMessage = string.Empty;
        public bool? isMinor;
        public string ageBand = nameof(IGPAgeBand.Unknown);
        public string evaluatedAt = string.Empty;
        public string playableUntil = string.Empty;
        public string nextPlayableAt = string.Empty;
        public string nextStatusChangeAt = string.Empty;

        public IGPAntiAddictionState ParsedState
        {
            get
            {
                return Enum.TryParse(state, true, out IGPAntiAddictionState parsed)
                    ? parsed
                    : IGPAntiAddictionState.Disabled;
            }
        }

        public IGPAgeBand ParsedAgeBand
        {
            get
            {
                return Enum.TryParse(ageBand, true, out IGPAgeBand parsed)
                    ? parsed
                    : IGPAgeBand.Unknown;
            }
        }
    }
}
