// =============================================================================
// TudadaSDK GameAction API (Unity)
//
// 게임 라이프사이클 액션 로깅 메서드 묶음.
// JS 측 `TudadaSDK.gameAction.start()` / `.complete()` / `.exit()` 와 일치하도록
// `TudadaSDK.Instance.gameAction.Start(...)` 형태로 노출합니다.
//
// 모든 호출은 fire-and-forget — 성공/실패 콜백 없음.
// =============================================================================

using System.Runtime.InteropServices;
using UnityEngine;
using Tudada;
using Tudada.Internal;

public partial class TudadaSDK : MonoBehaviour
{
    #region GameAction - jslib bindings

#if UNITY_WEBGL && !UNITY_EDITOR
    [DllImport("__Internal")]
    private static extern void TudadaSDK_GameAction_Start(string payloadJson, string additionalPayload);

    [DllImport("__Internal")]
    private static extern void TudadaSDK_GameAction_Complete(string payloadJson, string additionalPayload);

    [DllImport("__Internal")]
    private static extern void TudadaSDK_GameAction_Exit(string payloadJson, string additionalPayload);
#endif

    #endregion

    #region GameAction - Public namespace

    private GameActionApi _gameAction;

    /// <summary>
    /// 게임 액션 로깅 메서드 묶음 — JS 측 <c>TudadaSDK.gameAction</c> 와 동일.
    /// </summary>
    public GameActionApi gameAction
    {
        get
        {
            if (_gameAction == null) _gameAction = new GameActionApi(this);
            return _gameAction;
        }
    }

    /// <summary>
    /// TudadaSDK.gameAction — fire-and-forget 액션 로깅 API.
    /// </summary>
    public class GameActionApi
    {
        private readonly TudadaSDK _sdk;

        internal GameActionApi(TudadaSDK sdk) { _sdk = sdk; }

        /// <summary>
        /// 1판 시작.
        /// </summary>
        public void Start(GameActionStartPayload payload = null, string additionalPayload = null)
        {
            _sdk.LogDebug("gameAction.Start");
#if UNITY_WEBGL && !UNITY_EDITOR
            string mp = payload == null ? null : JsonUtility.ToJson(payload);
            TudadaSDK_GameAction_Start(mp ?? "", additionalPayload ?? "");
#else
            _sdk.LogEditor("gameAction.Start", payload == null ? "(no payload)" : JsonUtility.ToJson(payload));
#endif
        }

        /// <summary>
        /// 1판 정상 클리어.
        /// </summary>
        /// <param name="payload">필수 — result, playTime 포함</param>
        public void Complete(GameActionCompletePayload payload, string additionalPayload = null)
        {
            if (payload == null)
            {
                Debug.LogError($"{Constants.LOG_PREFIX} gameAction.Complete: payload is required");
                return;
            }

            _sdk.LogDebug($"gameAction.Complete - result: {payload.result}, playTime: {payload.playTime}");
#if UNITY_WEBGL && !UNITY_EDITOR
            string mp = JsonUtility.ToJson(payload);
            TudadaSDK_GameAction_Complete(mp, additionalPayload ?? "");
#else
            _sdk.LogEditor("gameAction.Complete", JsonUtility.ToJson(payload));
#endif
        }

        /// <summary>
        /// 1판 비정상 종료(포기/타임아웃).
        /// </summary>
        /// <param name="payload">필수 — playTime, reason 포함</param>
        public void Exit(GameActionExitPayload payload, string additionalPayload = null)
        {
            if (payload == null)
            {
                Debug.LogError($"{Constants.LOG_PREFIX} gameAction.Exit: payload is required");
                return;
            }

            _sdk.LogDebug($"gameAction.Exit - playTime: {payload.playTime}, reason: {payload.reason}");
#if UNITY_WEBGL && !UNITY_EDITOR
            string mp = JsonUtility.ToJson(payload);
            TudadaSDK_GameAction_Exit(mp, additionalPayload ?? "");
#else
            _sdk.LogEditor("gameAction.Exit", JsonUtility.ToJson(payload));
#endif
        }
    }

    #endregion
}
