﻿using JLGames.RocketDriver.Actions.Loaderx;
using JLGames.RocketDriver.Editor.Infra;
using UnityEditor;

namespace JLGames.RocketDriver.Editor
{
    public partial class MenuItems
    {
        //Bundle Build

        [MenuItem("Tools/RocketDriver/Project/Check Bundles", false, 1200)]
        public static void CheckAssetBundle()
        {
            if (BuildBundleUtil.CheckAssetBundlesEmpty()) return;
            BuildBundleUtil.CheckBundleNameForbit();
            BuildBundleUtil.CheckAbAssetDuplicate(false);
        }

        [MenuItem("Tools/RocketDriver/Project/Build Bundles(Win64)", false, 1211)]
        public static void BuildAssetBundlesForWin64()
        {
            BuildBundleUtil.BuildAssetBundles(BuildBundleConfig.Win64Target);
        }

#if UNITY_EDITOR_OSX
        [MenuItem("Tools/RocketDriver/Project/Build Bundles(OSX)", false, 1212)]
        public static void BuildAssetBundlesForOSX()
        {
            BuildBundleUtil.BuildAssetBundles(BuildBundleConfig.OSXTarget);
        }
#endif

        [MenuItem("Tools/RocketDriver/Project/Build Bundles(Webgl)", false, 1213)]
        public static void BuildAssetBundlesForWebgl()
        {
            BuildBundleUtil.BuildAssetBundles(BuildBundleConfig.WebglTarget);
        }

        [MenuItem("Tools/RocketDriver/Project/Build Bundles(Android)", false, 1214)]
        public static void BuildAssetBundlesForAndroid()
        {
            BuildBundleUtil.BuildAssetBundles(BuildBundleConfig.AndroidTarget);
        }

#if UNITY_EDITOR_OSX
        [MenuItem("Tools/RocketDriver/Project/Build Bundles(iOS)", false, 1215)]
        public static void BuildAssetBundlesForIOS()
        {
            BuildBundleUtil.BuildAssetBundles(BuildBundleConfig.IOSTarget);
        }
#endif

#if UNITY_EDITOR_OSX
        [MenuItem("Tools/RocketDriver/Project/Build Bundles(Win64,Webgl,Android,OSX,IOS)", false, 1230)]
#else
        [MenuItem("Tools/RocketDriver/Project/Build Bundles(Win64,Webgl,Android)", false, 1230)]
#endif
        public static void BuildAssetBundlesForAll()
        {
            foreach (var ti in BuildBundleConfig.Targets)
            {
                BuildBundleUtil.BuildAssetBundles(ti);
            }
        }

        //Project Build

        //支持输出参数：-out:path
        [MenuItem("Tools/RocketDriver/Project/Build Project Win64(Debug)", false, 1250)]
        public static void BuildForWin64Debug()
        {
            var options = BuildProjectConfig.GenOptionsWin64(true);
            BuildProjectUtil.PreparePlaform(options.targetGroup, options.target);
            BuildProjectUtil.BuildPlayer(options);
        }

        //支持输出参数：-out:path
        [MenuItem("Tools/RocketDriver/Project/Build Project Win64(Release)", false, 1251)]
        public static void BuildForWin64Release()
        {
            var options = BuildProjectConfig.GenOptionsWin64(false);
            BuildProjectUtil.PreparePlaform(options.targetGroup, options.target);
            BuildProjectUtil.BuildPlayer(options);
        }

        //支持输出参数：-out:path
        [MenuItem("Tools/RocketDriver/Project/Build Project Webgl(Debug)", false, 1260)]
        public static void BuildForWebglDebug()
        {
            var options = BuildProjectConfig.GenOptionsWebgl(true);
            BuildProjectUtil.PreparePlaform(options.targetGroup, options.target);
            BuildProjectUtil.BuildPlayer(options);
        }

        //支持输出参数：-out:path
        [MenuItem("Tools/RocketDriver/Project/Build Project Webgl(Release)", false, 1261)]
        public static void BuildForWebglRelease()
        {
            var options = BuildProjectConfig.GenOptionsWebgl(false);
            BuildProjectUtil.PreparePlaform(options.targetGroup, options.target);
            BuildProjectUtil.BuildPlayer(options);
        }

        //支持输出参数：-out:path
        [MenuItem("Tools/RocketDriver/Project/Build Project Android Apk(Debug)", false, 1270)]
        public static void BuildForAndroidDebug()
        {
            var options = BuildProjectConfig.GenOptionsAndroidApk(true);
            BuildProjectUtil.PreparePlaform(options.targetGroup, options.target);
            EditorUserBuildSettings.androidBuildSystem = AndroidBuildSystem.Gradle;
            EditorUserBuildSettings.exportAsGoogleAndroidProject = false;
            BuildProjectUtil.BuildPlayer(options);
        }

        //支持输出参数：-out:path
        [MenuItem("Tools/RocketDriver/Project/Build Project Android Apk(Release)", false, 1271)]
        public static void BuildForAndroidRelease()
        {
            var options = BuildProjectConfig.GenOptionsAndroidApk(false);
            BuildProjectUtil.PreparePlaform(options.targetGroup, options.target);
            EditorUserBuildSettings.androidBuildSystem = AndroidBuildSystem.Gradle;
            EditorUserBuildSettings.exportAsGoogleAndroidProject = false;
            BuildProjectUtil.BuildPlayer(options);
        }

#if UNITY_EDITOR_OSX

        //支持输出参数：-out:path
        [MenuItem("Tools/RocketDriver/Project/Build Project OSX(Debug)", false, 1280)]
        public static void BuildForMacDebug()
        {
            var options = BuildProjectConfig.GenOptionsOSX(true);
            BuildProjectUtil.PreparePlaform(options.targetGroup, options.target);
            BuildProjectUtil.BuildPlayer(options);
        }

        //支持输出参数：-out:path
        [MenuItem("Tools/RocketDriver/Project/Build Project OSX(Release)", false, 1281)]
        public static void BuildForMacRelease()
        {
            var options = BuildProjectConfig.GenOptionsOSX(false);
            BuildProjectUtil.PreparePlaform(options.targetGroup, options.target);
            BuildProjectUtil.BuildPlayer(options);
        }
        
        //支持输出参数：-out:path
        [MenuItem("Tools/RocketDriver/Project/Build Project iOS(Debug)", false, 1282)]
        public static void BuildForIOSDebug()
        {
            var options = BuildProjectConfig.GenOptionsIOS(false);
            BuildProjectUtil.PreparePlaform(options.targetGroup, options.target);
            BuildProjectUtil.BuildPlayer(options);
        }

        //支持输出参数：-out:path
        [MenuItem("Tools/RocketDriver/Project/Build Project iOS(Release)", false, 1283)]
        public static void BuildForIOSRelease()
        {
            var options = BuildProjectConfig.GenOptionsIOS(false);
            BuildProjectUtil.PreparePlaform(options.targetGroup, options.target);
            BuildProjectUtil.BuildPlayer(options);
        }
#endif

        [MenuItem("Tools/RocketDriver/Project/Gen LoaderSettings", false, 1290)]
        static void GenLoaderSettings()
        {
            EditorLoaderUtil.GenLoaderSettingsToSelection();
        }

        [MenuItem("Tools/RocketDriver/Project/Switch LoaderSettings Release", false, 1295)]
        static void SwitchToRelease()
        {
            SwitchRunMode(LoaderSettings.LoaderRunMode.Release);
        }

        [MenuItem("Tools/RocketDriver/Project/Switch LoaderSettings Debug", false, 1296)]
        static void SwitchToDebug()
        {
            SwitchRunMode(LoaderSettings.LoaderRunMode.Debug);
        }

        private static void SwitchRunMode(LoaderSettings.LoaderRunMode runMode)
        {
            var settingPath = "Assets/Resources/LoaderSettings.asset";
            var settings = AssetDatabase.LoadAssetAtPath<LoaderSettings>(settingPath);
            settings.SetRunMode(runMode);
            AssetDatabase.SaveAssets();
        }

        [MenuItem("Tools/RocketDriver/Project/Gen I18NSettings", false, 1340)]
        static void GenI18NSettings()
        {
            EditorI18NUtil.GenI18NSettingsToSelection();
        }

        [MenuItem("Tools/RocketDriver/Project/Gen AudioSettings", false, 1350)]
        static void GenAudioSettings()
        {
            EditorAudioUtil.GenAudioSettingsToSelection();
        }
    }
}