﻿using UnityEditor;
using UnityEngine;

namespace JLGames.RocketDriver.Editor.Infra
{
    public static class BuildProjectConfig
    {
        internal static readonly string ProjectRoot = "Builds/Projects";

        public static readonly string BuildProjectPathWebgl = $"{Application.dataPath}/../{ProjectRoot}/{BuildPlaforms.Webgl}";
        public static readonly string BuildProjectPathWin64 = $"{Application.dataPath}/../{ProjectRoot}/{BuildPlaforms.Win64}";
        public static readonly string BuildProjectPathAndroid = $"{Application.dataPath}/../{ProjectRoot}/{BuildPlaforms.Android}";
        public static readonly string BuildProjectPathIOS = $"{Application.dataPath}/../{ProjectRoot}/{BuildPlaforms.iOS}";
        public static readonly string BuildProjectPathOSX = $"{Application.dataPath}/../{ProjectRoot}/{BuildPlaforms.OSX}";

        public static readonly string VersionFolder = $"v{PlayerSettings.bundleVersion}";
        public static readonly string LastProductName = $"last_v{PlayerSettings.bundleVersion}_{PlayerSettings.applicationIdentifier}";

        public static readonly BuildPlayerOptions Empty = new BuildPlayerOptions
        {
            scenes = EditorSceneUtil.GetBuildScenes(),
            options = BuildOptions.None,
        };

        /// <summary>
        /// Webgl调试
        /// 直接调用Unity上的构建配置
        /// </summary>
        public static BuildPlayerOptions OptionsWebglDebug => new BuildPlayerOptions
        {
            scenes = EditorSceneUtil.GetBuildScenes(),
            target = BuildTarget.WebGL,
            targetGroup = BuildTargetGroup.WebGL,
            locationPathName = $"{BuildProjectPathWebgl}/{VersionFolder}/last_{PlayerSettings.productName}_debug",
            options = BuildOptions.None,
        };

        /// <summary>
        /// Webgl发行
        /// </summary>
        public static BuildPlayerOptions OptionsWebglRelease => new BuildPlayerOptions
        {
            scenes = EditorSceneUtil.GetBuildScenes(),
            target = BuildTarget.WebGL,
            targetGroup = BuildTargetGroup.WebGL,
            locationPathName = $"{BuildProjectPathWebgl}/{VersionFolder}/last_{PlayerSettings.productName}_release",
            options = BuildOptions.StrictMode,
        };

        /// <summary>
        /// Android调试Apk
        /// 直接调用Unity上的构建配置
        /// </summary>
        public static BuildPlayerOptions OptionsAndroidApkDebug => new BuildPlayerOptions
        {
            scenes = EditorSceneUtil.GetBuildScenes(),
            target = BuildTarget.Android,
            targetGroup = BuildTargetGroup.Android,
            locationPathName = $"{BuildProjectPathAndroid}/{VersionFolder}/{LastProductName}_debug.apk",
            options = BuildOptions.None,
        };

        /// <summary>
        /// Android发行Apk
        /// </summary>
        public static BuildPlayerOptions OptionsAndroidApkRelease => new BuildPlayerOptions
        {
            scenes = EditorSceneUtil.GetBuildScenes(),
            target = BuildTarget.Android,
            targetGroup = BuildTargetGroup.Android,
            locationPathName = $"{BuildProjectPathAndroid}/{VersionFolder}/{LastProductName}_release.apk",
            options = BuildOptions.StrictMode | BuildOptions.CompressWithLz4,
        };

        /// <summary>
        /// iOS调试
        /// 直接调用Unity上的构建配置
        /// </summary>
        public static BuildPlayerOptions OptionsiOSDebug => new BuildPlayerOptions
        {
            scenes = EditorSceneUtil.GetBuildScenes(),
            target = BuildTarget.iOS,
            targetGroup = BuildTargetGroup.iOS,
            locationPathName = $"{BuildProjectPathIOS}/{VersionFolder}/{LastProductName}_debug.ipa",
            options = BuildOptions.None,
        };

        /// <summary>
        /// iOS发行
        /// </summary>
        public static BuildPlayerOptions OptionsiOSRelease => new BuildPlayerOptions
        {
            scenes = EditorSceneUtil.GetBuildScenes(),
            target = BuildTarget.iOS,
            targetGroup = BuildTargetGroup.iOS,
            locationPathName = $"{BuildProjectPathIOS}/{VersionFolder}/{LastProductName}_release.ipa",
            options = BuildOptions.StrictMode | BuildOptions.CompressWithLz4,
        };

        /// <summary>
        /// Win64调试
        /// 直接调用Unity上的构建配置
        /// </summary>
        public static BuildPlayerOptions OptionsWin64Debug => new BuildPlayerOptions
        {
            scenes = EditorSceneUtil.GetBuildScenes(),
            target = BuildTarget.StandaloneWindows64,
            targetGroup = BuildTargetGroup.Standalone,
            locationPathName = $"{BuildProjectPathWin64}/{VersionFolder}/debug/{LastProductName}.exe",
            options = BuildOptions.None,
        };

        /// <summary>
        /// Win64发行
        /// </summary>
        public static BuildPlayerOptions OptionsWin64Release => new BuildPlayerOptions
        {
            scenes = EditorSceneUtil.GetBuildScenes(),
            target = BuildTarget.StandaloneWindows64,
            targetGroup = BuildTargetGroup.Standalone,
            locationPathName = $"{BuildProjectPathWin64}/{VersionFolder}/release/{LastProductName}.exe",
            options = BuildOptions.StrictMode | BuildOptions.CompressWithLz4,
        };

        /// <summary>
        /// OSX调试
        /// </summary>
        public static BuildPlayerOptions OptionsOSXDebug => new BuildPlayerOptions
        {
            scenes = EditorSceneUtil.GetBuildScenes(),
            target = BuildTarget.StandaloneOSX,
            targetGroup = BuildTargetGroup.Standalone,
            locationPathName = $"{BuildProjectPathOSX}/{VersionFolder}/debug/{LastProductName}",
            options = BuildOptions.None,
        };

        /// <summary>
        /// OSX发行
        /// </summary>
        public static BuildPlayerOptions OptionsOSXRelease => new BuildPlayerOptions
        {
            scenes = EditorSceneUtil.GetBuildScenes(),
            target = BuildTarget.StandaloneOSX,
            targetGroup = BuildTargetGroup.Standalone,
            locationPathName = $"{BuildProjectPathOSX}/{VersionFolder}/release/{LastProductName}",
            options = BuildOptions.StrictMode | BuildOptions.CompressWithLz4,
        };

        public static BuildPlayerOptions GenOptionsWebgl(bool debug)
        {
            return debug ? OptionsWebglDebug : OptionsWebglRelease;
        }

        public static BuildPlayerOptions GenOptionsAndroidApk(bool debug)
        {
            return debug ? OptionsAndroidApkDebug : OptionsAndroidApkRelease;
        }

        public static BuildPlayerOptions GenOptionsIOS(bool debug)
        {
            return debug ? OptionsiOSDebug : OptionsiOSRelease;
        }

        public static BuildPlayerOptions GenOptionsWin64(bool debug)
        {
            return debug ? OptionsWin64Debug : OptionsWin64Release;
        }

        public static BuildPlayerOptions GenOptionsOSX(bool debug)
        {
            return debug ? OptionsOSXDebug : OptionsOSXRelease;
        }

        public static BuildPlayerOptions Clone(BuildPlayerOptions options)
        {
            return new BuildPlayerOptions
            {
                scenes = (string[]) options.scenes?.Clone(),
                locationPathName = options.locationPathName,
                assetBundleManifestPath = options.assetBundleManifestPath,
                targetGroup = options.targetGroup,
                target = options.target,
                options = options.options,
#if UNITY_2020_2_OR_NEWER
                extraScriptingDefines = (string[]) options.extraScriptingDefines?.Clone(),
#endif
            };
        }
    }
}