#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<IGPDesktopSessionCommandResult> LyingBottleForwardAsync(
            string contentJson,
            int? appIdOverride = null)
        {
            var session = await EnsureDesktopSessionAsync(appIdOverride);
            EnsureDesktopUserContextAvailable();
            return await session.LyingBottleForwardAsync(
                contentJson ?? string.Empty,
                RuntimeCancellationToken);
        }

        public async Task<IGPDesktopSessionCommandResult> CloudArchiveForwardAsync(
            string contentJson,
            int? appIdOverride = null)
        {
            var session = await EnsureDesktopSessionAsync(appIdOverride);
            EnsureDesktopUserContextAvailable();
            return await session.CloudArchiveForwardAsync(
                contentJson ?? string.Empty,
                RuntimeCancellationToken);
        }

        public async Task<IGPDesktopSessionCommandResult> LeaderboardForwardAsync(
            string contentJson,
            int? appIdOverride = null)
        {
            var session = await EnsureDesktopSessionAsync(appIdOverride);
            EnsureDesktopUserContextAvailable();
            return await session.LeaderboardForwardAsync(
                contentJson ?? string.Empty,
                RuntimeCancellationToken);
        }

        public async Task<IGPDesktopSessionCommandResult> RequestDesktopShareAsync(
            string contentJson,
            byte[]? contentBytes = null,
            int? appIdOverride = null)
        {
            var session = await EnsureDesktopSessionAsync(appIdOverride);
            return await session.RequestDesktopShareAsync(
                contentJson ?? string.Empty,
                contentBytes ?? Array.Empty<byte>(),
                RuntimeCancellationToken);
        }

        public async Task<IGPDesktopSessionCommandResult> ShareForwardAsync(
            string contentJson,
            byte[]? contentBytes = null,
            int? appIdOverride = null)
        {
            return await RequestDesktopShareAsync(
                contentJson,
                contentBytes,
                appIdOverride);
        }
    }
}
