#nullable enable
using System.Threading.Tasks;

namespace IGP.UnitySDK
{
    public partial class IGPRuntimeManager
    {
        private sealed class IGPMobileHostSessionPlatformRuntime : IGPHostSessionPlatformRuntimeBase
        {
            internal IGPMobileHostSessionPlatformRuntime(IGPRuntimeManager runtime)
                : base(runtime)
            {
            }

            public override IGPHostSessionPlatform Platform => IGPHostSessionPlatform.Mobile;
            public override string TransportName => "mobile-host-session";
            public override string ConnectionSource => "mobile_host_session";
            public override string AttachedReason => "mobile-host-session-attached";
            public override string DetachedReason => "mobile-host-session-detached";
            public override string LogEndpoint => "-";

            public override IIGPHostSessionTransport CreateTransport()
            {
                return new IGPMobileHostSessionTransport(Runtime.mobileHostSessionBridge);
            }

            public override IGPDesktopSessionAttachRequest CreateAttachRequest(int appId)
            {
                return CreateCommonAttachRequest(appId, string.Empty, 0);
            }

            public override async Task InitializeSessionAsync()
            {
                if (ShouldAutoAttach)
                {
                    await Runtime.TryAttachHostSessionAsync();
                }
            }

            public override Task<bool> RecoverUnavailableSessionAsync(int? appIdOverride)
            {
                return Task.FromResult(false);
            }

            public override Task<bool> AuthorizeAsync()
            {
                Runtime.ApplyAuthorizationSkipped();
                return Task.FromResult(true);
            }

            public override void Tick()
            {
            }

            public override void OnAttachSucceeded()
            {
            }

            public override void ScheduleAttachRecoveryIfNeeded()
            {
            }

            public override void ScheduleAuthorizationRecoveryIfNeeded()
            {
            }

            public override void Dispose()
            {
                Runtime.mobileHostSessionBridge.Close("mobile-host-runtime-destroyed");
                Runtime.mobileHostSessionBridge.SetFrameSender(null);
            }
        }
    }
}
