using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using UnityEditor;

namespace Unity.VisualScripting
{
    [Product(ID)]
    public sealed class BoltProduct : Product
    {
        public BoltProduct() { }

        public override void Initialize()
        {
            base.Initialize();

            logo = BoltCore.Resources.LoadTexture("LogoBolt.png", CreateTextureOptions.Scalable)?.Single();
        }

        public override string configurationPanelLabel => "Bolt";

        public override string name => "Bolt";
        public override string description => "";
        public override string authorLabel => "Designed & Developed by ";
        public override string author => "";
        public override string copyrightHolder => "Unity";
        public override SemanticVersion version => PackageVersionUtility.version;
        public override string publisherUrl => "";
        public override string websiteUrl => "";
        public override string supportUrl => "";
        public override string manualUrl => "https://docs.unity3d.com/Packages/com.unity.bolt@latest";
        public override string assetStoreUrl => "http://u3d.as/1Md2";

        public const string ID = "Bolt";

#if VISUAL_SCRIPT_INTERNAL
        public const int ToolsMenuPriority = -990000;
        public const int DeveloperToolsMenuPriority = ToolsMenuPriority + 1000;
#endif

        public static BoltProduct instance => (BoltProduct)ProductContainer.GetProduct(ID);

        private static bool PrepareForRelease()
        {
            if (!EditorUtility.DisplayDialog("Delete Generated Files", "This action will delete all generated files, including those containing user data.\n\nAre you sure you want to continue?", "Confirm", "Cancel"))
            {
                return false;
            }

            PluginConfiguration.DeleteAllProjectSettings();

            foreach (var plugin in PluginContainer.plugins)
            {
                PathUtility.DeleteDirectoryIfExists(plugin.paths.persistentGenerated);
                PathUtility.DeleteDirectoryIfExists(plugin.paths.transientGenerated);
            }

            return true;
        }

#if VISUAL_SCRIPT_INTERNAL
        [MenuItem("Tools/Bolt/Internal/Export Release Asset Package...", priority = DeveloperToolsMenuPriority + 102)]
#endif
        private static void ExportReleasePackage()
        {
            if (!PrepareForRelease())
            {
                return;
            }

            var exportPath = EditorUtility.SaveFilePanel("Export Release Package",
                Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
                "Bolt_" + instance.version.ToString().Replace(".", "_").Replace(" ", "_"),
                "unitypackage");

            if (exportPath == null)
            {
                return;
            }

            var packageDirectory = Path.GetDirectoryName(exportPath);

            var paths = new List<string>()
            {
                PathUtility.GetPackageRootPath()
            };

            AssetDatabase.ExportPackage(paths.ToArray(), exportPath, ExportPackageOptions.Recurse);

            if (EditorUtility.DisplayDialog("Export Release Package", "Release package export complete.\nOpen containing folder?", "Open Folder", "Close"))
            {
                Process.Start(packageDirectory);
            }
        }
    }
}