// =============================================================================
// TudadaSDK Core Types
//
// SDK 공통 타입 및 콜백 delegate 정의
// =============================================================================

using System;
using Tudada.Internal;

namespace Tudada
{
    /// <summary>
    /// 일반적인 콜백 결과 (성공/실패 공통)
    /// </summary>
    [Serializable]
    public class GeneralCallbackResult
    {
        /// <summary>
        /// 에러 메시지 (성공 시 "ok" 또는 해당 API의 성공 메시지)
        /// </summary>
        public string errMsg;
    }

    /// <summary>
    /// 성공 콜백 delegate (결과 포함)
    /// </summary>
    /// <typeparam name="T">결과 타입</typeparam>
    /// <param name="result">결과 객체</param>
    public delegate void TudadaSuccessCallback<T>(T result);

    /// <summary>
    /// 성공 콜백 delegate (결과 없음)
    /// </summary>
    public delegate void TudadaSuccessCallback();

    /// <summary>
    /// 실패 콜백 delegate
    /// </summary>
    /// <param name="error">에러 정보</param>
    public delegate void TudadaFailCallback(GeneralCallbackResult error);

    /// <summary>
    /// 실패 콜백 delegate (에러 메시지만)
    /// </summary>
    /// <param name="errMsg">에러 메시지</param>
    public delegate void TudadaFailCallbackSimple(string errMsg);

    /// <summary>
    /// 이벤트 핸들러 delegate (결과 포함)
    /// </summary>
    /// <typeparam name="T">결과 타입</typeparam>
    /// <param name="result">결과 객체</param>
    public delegate void TudadaEventHandler<T>(T result);

    /// <summary>
    /// 이벤트 핸들러 delegate (결과 없음)
    /// </summary>
    public delegate void TudadaEventHandler();

    /// <summary>
    /// jslib 콜백 데이터 파싱 결과 (내부 사용)
    /// </summary>
    internal class CallbackData
    {
        /// <summary>
        /// 콜백 ID
        /// </summary>
        public int callbackId;

        /// <summary>
        /// 콜백 데이터
        /// </summary>
        public string data;

        /// <summary>
        /// "callbackId|data" 형식의 문자열을 파싱
        /// </summary>
        /// <param name="raw">원본 문자열</param>
        /// <returns>파싱된 CallbackData</returns>
        public static CallbackData Parse(string raw)
        {
            if (string.IsNullOrEmpty(raw))
            {
                return new CallbackData { callbackId = -1, data = "" };
            }

            int separatorIndex = raw.IndexOf(Constants.CALLBACK_SEPARATOR);
            if (separatorIndex < 0)
            {
                return new CallbackData { callbackId = -1, data = raw };
            }

            string idStr = raw.Substring(0, separatorIndex);
            string data = raw.Substring(separatorIndex + 1);

            if (!int.TryParse(idStr, out int id))
            {
                return new CallbackData { callbackId = -1, data = data };
            }

            return new CallbackData { callbackId = id, data = data };
        }
    }
}
