﻿using System;
using JLGames.RocketDriver.CSharp.Utils;
using UnityEditor;

namespace JLGames.RocketDriver.Editor.Infra
{
    /// <summary>
    /// Macro tools
    /// 宏处理工具
    /// </summary>
    public static class EditorMacroUtil
    {
        private const char MacroSeparator = ';';
        private static bool m_Suc = false;

        /// <summary>
        /// Add macro definitions to the current platform
        /// 向当前平台增加宏定义
        /// </summary>
        /// <param name="macro"></param>
        public static bool SetMacro(string macro)
        {
            return SetMacro(EditorUserBuildSettings.selectedBuildTargetGroup, macro);
        }

        /// <summary>
        /// Add macro definition to specified platform
        /// 向指定平台增加宏定义
        /// </summary>
        /// <param name="targetGroup"></param>
        /// <param name="macro"></param>
        public static bool SetMacro(BuildTargetGroup targetGroup, string macro)
        {
            var macroStr = PlayerSettings.GetScriptingDefineSymbolsForGroup(targetGroup);
            var macros = macroStr.Split(MacroSeparator);
            macros = Add(macros, macro);
            if (m_Suc)
            {
                macroStr = ToMacroValue(macros);
                PlayerSettings.SetScriptingDefineSymbolsForGroup(targetGroup, macroStr);
            }

            return m_Suc;
        }

        /// <summary>
        /// Clear macro definitions for the current platform
        /// 清除当前平台的宏定义
        /// </summary>
        /// <param name="macro"></param>
        public static bool ClearMacro(string macro)
        {
            return ClearMacro(EditorUserBuildSettings.selectedBuildTargetGroup, macro);
        }

        /// <summary>
        /// Clear the macro definition for the specified platform
        /// 清除指定平台的宏定义
        /// </summary>
        /// <param name="targetGroup"></param>
        /// <param name="macro"></param>
        public static bool ClearMacro(BuildTargetGroup targetGroup, string macro)
        {
            var macroStr = PlayerSettings.GetScriptingDefineSymbolsForGroup(targetGroup);
            var macros = macroStr.Split(MacroSeparator);
            macros = Remove(macros, macro);
            if (m_Suc)
            {
                macroStr = ToMacroValue(macros);
                PlayerSettings.SetScriptingDefineSymbolsForGroup(targetGroup, macroStr);
            }

            return m_Suc;
        }

        private static int FindMacro(string[] macros, string macro)
        {
            if (null == macros || macros.Length == 0) return -1;
            var index = Array.FindIndex(macros, s => s == macro);
            return index;
        }

        private static string[] Remove(string[] macros, string macro)
        {
            var index = FindMacro(macros, macro);
            if (-1 == index)
            {
                m_Suc = false;
                return macros;
            }

            m_Suc = true;
            return ArrayUtil.RemoveElement(macros, index, 1);
        }

        private static string[] Add(string[] macros, string macro)
        {
            var index = FindMacro(macros, macro);
            if (-1 != index)
            {
                m_Suc = false;
                return macros;
            }

            m_Suc = true;
            return ArrayUtil.ConcatArray(macros, macro);
        }

        private static string ToMacroValue(string[] macroItem)
        {
            if (macroItem == null || macroItem.Length == 0) return "";
            return string.Join(MacroSeparator + "", macroItem);
        }
    }
}