#nullable enable
using System;
using System.Threading.Tasks;
using IGP.Multiplayer;
using UnityEngine;

public sealed class IGPMultiplayerDataPlaneExample : MonoBehaviour
{
    [SerializeField] private IGPMultiplayerRuntime? multiplayerRuntime = null;

    private void Awake() =>
        multiplayerRuntime ??= FindObjectOfType<IGPMultiplayerRuntime>();

    public async Task ConnectAsync(
        string roomId,
        string playerId,
        string sdkDescriptorJson)
    {
        if (multiplayerRuntime == null)
        {
            throw new InvalidOperationException("IGPMultiplayerRuntime is not assigned.");
        }

        IGPMultiplayerDescriptor descriptor =
            IGPMultiplayerDescriptor.FromSdkDescriptorJson(
                roomId,
                playerId,
                sdkDescriptorJson);

        bool connected = await multiplayerRuntime.TryCreateRuntimeAsync(descriptor);
        if (!connected || !multiplayerRuntime.IsRealtimeReady)
        {
            throw new InvalidOperationException("RoomNode Game data plane did not become ready.");
        }

        Debug.Log($"IGP Game data plane ready for room {descriptor.RoomId}.");
    }
}
