using System;
using System.Linq;
using UnityEditor;
using UnityEngine;

namespace Stary.Evo.Editor
{
    public class ChangePlayerMode
    {
        public static PLayerMode PLayerMode
        {
            get => _pLayerMode;
            set => SetPlayerMode(value);
        }

        private static PLayerMode _pLayerMode;

        private const string EditorSimulateMode = "Evo/ChangePlayerMode/EditorSimulateMode(编辑器调试模式)";
        private const string OfflinePlayMode = "Evo/ChangePlayerMode/OfflinePlayMode(本地运行模式)";
        private const string HostPlayMode = "Evo/ChangePlayerMode/HostPlayMode(服务器运行模式)";
        private const string WebPlayMode = "Evo/ChangePlayerMode/WebPlayMode(Web运行模式)";

        [MenuItem(EditorSimulateMode)]
        private static void SetEditorMode() => SetPlayerMode(PLayerMode.EDITOR_SIMULATEMODE);

        [MenuItem(OfflinePlayMode)]
        private static void SetOfflineMode() => SetPlayerMode(PLayerMode.OFFLINE_PLAYMODE);

        [MenuItem(HostPlayMode)]
        private static void SetHostMode() => SetPlayerMode(PLayerMode.HOST_PLAYMODE);

        [MenuItem(WebPlayMode)]
        private static void SetWebMode() => SetPlayerMode(PLayerMode.WEB_PLAYMODE);

        [MenuItem(EditorSimulateMode, true)]
        private static bool ValidateModeMenu()
        {
            string platform = EditorPrefs.GetString("ChangePLayerMode", PLayerMode.EDITOR_SIMULATEMODE.ToString());
            Menu.SetChecked(EditorSimulateMode, platform == PLayerMode.EDITOR_SIMULATEMODE.ToString());
            Menu.SetChecked(OfflinePlayMode, platform == PLayerMode.OFFLINE_PLAYMODE.ToString());
            Menu.SetChecked(HostPlayMode, platform == PLayerMode.HOST_PLAYMODE.ToString());
            Menu.SetChecked(WebPlayMode, platform == PLayerMode.WEB_PLAYMODE.ToString());
            Debug.LogError("CheckPlatform");
            return true;
        }

        private static void SetPlayerMode(PLayerMode mode)
        {
            // 清除所有旧模式定义
            var currentTarget = EditorUserBuildSettings.selectedBuildTargetGroup;
            if (currentTarget == BuildTargetGroup.Unknown) return;

            var defines = PlayerSettings.GetScriptingDefineSymbolsForGroup(currentTarget)
                .Split(';')
                .Where(d => !Enum.GetNames(typeof(PLayerMode)).Contains(d))
                .ToList();

            // 添加新模式
            defines.Add(mode.ToString());
            PlayerSettings.SetScriptingDefineSymbolsForGroup(currentTarget, string.Join(";", defines));
            Debug.Log($"当前编译符号: {string.Join(";", defines)}"); // 添加调试日志
            _pLayerMode = mode;
            EditorPrefs.SetString("ChangePLayerMode", _pLayerMode.ToString());
            AssetDatabase.Refresh();
            // 添加解决方案文件重新生成逻辑
            EditorApplication.delayCall += () =>
            {
                EditorApplication.ExecuteMenuItem("Assets/Open C# Project");
                UnityEditor.Compilation.CompilationPipeline.RequestScriptCompilation();
                Debug.Log("已强制重新生成解决方案文件");
            };
        }
    }

    public enum PLayerMode
    {
        //编辑仿真模式,
        EDITOR_SIMULATEMODE,

        //单机运行模式
        OFFLINE_PLAYMODE,

        //联机运行模式
        HOST_PLAYMODE,

        //web运行模式
        WEB_PLAYMODE
    }
}