using UnityEngine;
using UnityEngine.Serialization;

namespace IGP.UnitySDK
{
    public enum IGPLogLevel
    {
        Off = 0,
        Error = 1,
        Warning = 2,
        Info = 3,
        Debug = 4
    }

    /// <summary>
    /// IGP SDK 配置资源
    /// </summary>
    [CreateAssetMenu(fileName = "IGPConfig", menuName = "IGP/Config", order = 0)]
    public class IGPConfig : ScriptableObject
    {
        public const string DefaultAuthorizationFailureFallbackTitle = "网络不可用";
        public const string DefaultAuthorizationFailureFallbackMessage =
            "当前网络不可用，请检查网络后重试。";
        public const string DefaultAuthorizationFailureFallbackHint =
            "请检查网络连接，并重新尝试授权。";
        public const string DefaultAuthorizationFailureFallbackButtonText = "重试";
        public const string DefaultAuthorizationFailureFallbackQuitButtonText = "退出游戏";

        [Header("SDK")]
        [Tooltip("SDK 连接的桌面端环境。PROD 连接 IndieGamesPass，PREVIEW 连接 IndieGamesPass Preview，DEV 连接 IndieSpark。正式发布请保持 PROD。")]
        public IGPSDKEnvironment sdkEnvironment = IGPSDKEnvironment.PROD;

        [Header("Hosted Runtime")]
        [Tooltip("可选。心跳包发送间隔（秒）；不填时使用默认值。")]
        [HideInInspector]
        public float heartbeatInterval = 30f;

        [Tooltip("可选。SDK 联机诊断日志等级。Debug 会包含 hosted session、KCP 数据面和 P2P 消息收发摘要；正式发布建议使用 Off。")]
        public IGPLogLevel debugLogging = IGPLogLevel.Off;

        [Tooltip("可选。是否显示 SDK 自带网络诊断浮层（OnGUI），包含 KCP 健康状态、故障原因、RTT、队列和 UDP 统计。只建议在开发排查时打开。")]
        public bool showNetworkDiagnostics = false;

        [Tooltip("可选。是否按启动信息自动接入已分配房间。")]
        [HideInInspector]
        public bool autoConnect = false;

        [Header("Authorization Fallback")]
        [Tooltip("授权验证失败时是否显示 SDK 自带的保底提示（OnGUI）。")]
        public bool showAuthorizationFailureFallback = true;

        [Tooltip("默认保底提示标题。留空时使用 SDK 默认文案。")]
        public string authorizationFailureFallbackTitle = DefaultAuthorizationFailureFallbackTitle;

        [Tooltip("默认保底提示正文。留空时使用 SDK 默认文案。")]
        public string authorizationFailureFallbackMessage = DefaultAuthorizationFailureFallbackMessage;

        [Tooltip("默认保底提示引导语。留空时使用 SDK 默认文案。")]
        public string authorizationFailureFallbackHint = DefaultAuthorizationFailureFallbackHint;

        [Tooltip("默认保底提示确认按钮文案。留空时使用 SDK 默认文案。")]
        public string authorizationFailureFallbackButtonText = DefaultAuthorizationFailureFallbackButtonText;

        [Tooltip("默认保底提示退出游戏按钮文案。留空时使用 SDK 默认文案。")]
        public string authorizationFailureFallbackQuitButtonText = DefaultAuthorizationFailureFallbackQuitButtonText;

        [Header("Desktop Session")]
        [Tooltip("必填。用于识别当前游戏并附着 desktop 能力。")]
        public int appId = 0;

        [Tooltip("可选。启动时是否自动尝试附着 desktop session。")]
        [HideInInspector]
        public bool desktopSessionAutoAttach = true;

        [Tooltip("可选。Desktop session 管道地址；留空时使用 SDK 默认值。")]
        [HideInInspector]
        public string desktopPipeEndpoint = string.Empty;

        [HideInInspector]
        [FormerlySerializedAs("desktopExecutablePathOverride")]
        public string desktopExecutablePathDebugOverride = string.Empty;

        [Tooltip("可选。覆盖 desktop 启动命令，仅用于特殊发行形态或调试。")]
        [HideInInspector]
        public string desktopLaunchCommand = string.Empty;
    }
}
