#nullable enable
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.IO.Pipes;
using System.Net.Sockets;
using System.Security.Cryptography;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using UnityEngine;
using UnityEngine.Events;
#if UNITY_EDITOR
using UnityEditor;
#endif
using IGP.UnitySDK.Abstractions;
using IGP.UnitySDK.Models;
using IGP.UnitySDK.Core;
using IGP.UnitySDK.Network;
using IGP.UnitySDK.Protocol;

namespace IGP.UnitySDK
{
    public partial class IGPRuntimeManager
    {

        public async Task<IGPAntiAddictionStatus> RefreshAntiAddictionStatusAsync(int? appIdOverride = null)
        {
            var appId = ResolveDesktopAppId(appIdOverride);
            if (!appId.HasValue)
            {
                throw new IGPSDKException("IGP appId is required", IGPErrorCodes.ERR_APP_ID_REQUIRED);
            }

            var session = await EnsureDesktopSessionAsync(appId.Value);
            var status = await session.GetDesktopAntiAddictionStatusAsync(RuntimeCancellationToken);
            currentAntiAddictionStatus = status;
            onAntiAddictionStateChanged?.Invoke(status);
            return status;
        }

        public async Task<IGPAntiAddictionRealNameWebSession> CreateAntiAddictionRealNameWebSessionAsync(int? appIdOverride = null)
        {
            var appId = ResolveDesktopAppId(appIdOverride);
            if (!appId.HasValue)
            {
                throw new IGPSDKException("IGP appId is required", IGPErrorCodes.ERR_APP_ID_REQUIRED);
            }

            var session = await EnsureDesktopSessionAsync(appId.Value);
            return await session.CreateDesktopAntiAddictionRealNameUrlAsync(
                appId.Value,
                RuntimeCancellationToken);
        }

        private void HandleDesktopAntiAddictionChanged(IGPAntiAddictionStatus status)
        {
            currentAntiAddictionStatus = status;
            if (!isDestroyed && status != null)
            {
                onAntiAddictionStateChanged?.Invoke(status);
            }
        }
    }
}
