#nullable enable
using IGP.UnitySDK.Models;
using System;
using System.Threading;
using System.Threading.Tasks;
using IGP.UnitySDK;
using IGP.UnitySDK.Abstractions;
using Newtonsoft.Json;

namespace IGP.Multiplayer
{
    public sealed class IGPDesktopHostedBootstrapAvailableEvent
    {
        public int appId;
        public string roomId = string.Empty;
    }

    public sealed 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 string generatedAt = string.Empty;
    }

    internal static class IGPDesktopHostedCommands
    {
        internal const int CapabilityFieldNumber = 4;
        internal const int RequestHostedBootstrapCommand = 18;
        internal const string BootstrapAvailableRequestId = "desktop-hosted-bootstrap-available";

        internal static async Task<IGPDesktopHostedBootstrapContext> RequestBootstrapAsync(
            IIGPDesktopCommandGateway gateway,
            int? appId,
            CancellationToken cancellationToken)
        {
            var payload = appId > 0 ? JsonConvert.SerializeObject(new { appId }) : null;
            var result = await gateway.SendAsync(
                RequestHostedBootstrapCommand,
                CapabilityFieldNumber,
                payload,
                cancellationToken: cancellationToken);
            if (string.IsNullOrWhiteSpace(result.ContentJson))
            {
                return new IGPDesktopHostedBootstrapContext();
            }

            return JsonConvert.DeserializeObject<IGPDesktopHostedBootstrapContext>(result.ContentJson)
                ?? new IGPDesktopHostedBootstrapContext();
        }
    }
}
