#nullable enable
using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Pipes;
using System.Threading;
using System.Threading.Tasks;

using IGP.UnitySDK.Models;
using Newtonsoft.Json;

namespace IGP.UnitySDK
{
    internal sealed partial class IGPHostSessionClient
    {

        public async Task<IGPAntiAddictionStatus> GetDesktopAntiAddictionStatusAsync(
            CancellationToken cancellationToken = default)
        {
            var result = await SendCommandAsync(
                IGPDesktopSessionCommandType.GetDesktopAntiAddictionStatus,
                cancellationToken);

            return ParseCommandPayload(
                result.ContentJson,
                () => CurrentSession?.AntiAddictionStatus ?? new IGPAntiAddictionStatus());
        }

        public async Task<IGPAntiAddictionRealNameWebSession> CreateDesktopAntiAddictionRealNameUrlAsync(
            int? appId = null,
            CancellationToken cancellationToken = default)
        {
            var payload = appId.HasValue && appId.Value > 0
                ? JsonConvert.SerializeObject(new
                {
                    appId = appId.Value,
                })
                : null;

            var result = await SendCommandAsync(
                IGPDesktopSessionCommandType.CreateDesktopAntiAddictionRealNameUrl,
                cancellationToken,
                contentJson: payload);

            return ParseCommandPayload(
                result.ContentJson,
                () => new IGPAntiAddictionRealNameWebSession());
        }

        public async Task<IGPAntiAddictionAccountSummary> SubmitDesktopAntiAddictionRealNameAsync(
            string realName,
            string idCardNumber,
            string identityDocumentType,
            CancellationToken cancellationToken = default)
        {
            var payload = JsonConvert.SerializeObject(new
            {
                realName,
                identityDocumentType,
                idCardNumber,
            });
            var result = await SendCommandAsync(
                IGPDesktopSessionCommandType.SubmitDesktopAntiAddictionRealName,
                cancellationToken,
                contentJson: payload);

            return ParseCommandPayload(
                result.ContentJson,
                () => new IGPAntiAddictionAccountSummary());
        }
    }
}
