﻿#if UNITY_EDITOR
using System.Linq;
using UnityEditor;
using UnityEngine;

namespace ModestTree
{
    public class ExportPopup : EditorWindow
    {
        AbScenePlatforms[] _platformOptions = new AbScenePlatforms[]
        {
            AbScenePlatforms.Pc,
            AbScenePlatforms.Android,
            AbScenePlatforms.Ios,
            AbScenePlatforms.WebGl,
            AbScenePlatforms.OculusQuest
        };
        bool[] _selectedPlatforms = new bool[6];
        bool _compressed = false;
        bool _clearAllShaders = false;

        [MenuItem("ModestTree/Export Helper")]
        [MenuItem("Assets/Modest Tree Export/Open Export Helper")]
        public static void ShowWindow()
        {
            GetWindow<ExportPopup>("Modest Tree Export");
        }

        private void OnGUI()
        {
            GUILayout.Space(10);
            GUILayout.Label("Select a valid asset and select platforms", EditorStyles.boldLabel);

            for (int i = 0; i < _platformOptions.Length; i++)
            {
                _selectedPlatforms[i] = EditorGUILayout.Toggle(GetPlatformString(_platformOptions[i]), _selectedPlatforms[i]);
            }

            GUILayout.Space(10);
            GUILayout.Label("Bundle Options", EditorStyles.boldLabel);
            _compressed = EditorGUILayout.Toggle("Compressed", _compressed);
            GUILayout.Space(10);

            GUILayout.Space(10);
            GUILayout.Label("Extra Settings", EditorStyles.boldLabel);
            _clearAllShaders = EditorGUILayout.Toggle("Clear All Compiled Shaders", _clearAllShaders);
            GUILayout.Space(10);

            if (GUILayout.Button("Export") && ExportHelper.CheckSelected())
            {
                if (_clearAllShaders)
                {
                    ClearAllShaders();
                }

                // Note (Aaron H): Cache the selected objects so we can restore them after Unity
                // reloads the scripting domain.
                Object[] selectedObjects = Selection.objects;

                var platforms = _platformOptions.Where((platform, index) => _selectedPlatforms[index]).ToArray();
                var options = _compressed ? BuildAssetBundleOptions.None : BuildAssetBundleOptions.UncompressedAssetBundle;
                ExportHelper.ExportBundles(platforms, options);

                // Note (Aaron H): Restore selection
                Selection.objects = selectedObjects;
            }
        }

        void ClearAllShaders()
        {
            string[] guids = AssetDatabase.FindAssets("t:Shader");
            foreach (string guid in guids)
            {
                string path = AssetDatabase.GUIDToAssetPath(guid);
                Shader shader = AssetDatabase.LoadAssetAtPath<Shader>(path);
                ShaderUtil.ClearCachedData(shader);
            }
        }

        public static string GetPlatformString(AbScenePlatforms platform)
        {
            switch (platform)
            {
                case AbScenePlatforms.Pc:
                    return "Windows";
                case AbScenePlatforms.Android:
                    return "Android";
                case AbScenePlatforms.Ios:
                    return "iOS";
                case AbScenePlatforms.WebGl:
                    return "WebGL";
                case AbScenePlatforms.OculusQuest:
                    return "Oculus Quest";
                default:
                    return "Unknown";
            }
        }
    }
}
#endif
