using System;
using UnityEditor;
using UnityEngine;

namespace MajacloudSdk.Editor
{
    /// <summary>
    /// Entry points for `Unity -batchmode -executeMethod MajacloudSdk.Editor.MajacloudBatch.X`.
    /// Pass -majacloudOutput &lt;path&gt; to ExportPackage.
    /// </summary>
    public static class MajacloudBatch
    {
        /// <summary>Imports TMP essential resources and exits when done. Run it WITHOUT -quit: the import completes on a later editor update.</summary>
        public static void EnsureTmpResources()
        {
            if (TmpResources.IsReady)
            {
                Log("TMP resources ready");
                if (Application.isBatchMode) EditorApplication.Exit(0);
                return;
            }
            TmpResources.Import(ready =>
            {
                Log(ready ? "TMP resources ready" : "TMP resources missing after import");
                if (Application.isBatchMode) EditorApplication.Exit(ready ? 0 : 1);
            });
        }

        public static void BuildSamples() => Run("BuildSamples", () => StarterSampleBuilder.Build(false));

        public static void ExportPackage() => Run("ExportPackage", () =>
        {
            var output = Argument("-majacloudOutput") ?? System.IO.Path.Combine(System.IO.Directory.GetParent(Application.dataPath)?.FullName ?? ".", MajacloudPackageExporter.DefaultFileName);
            MajacloudPackageExporter.Export(output);
        });

        public static void BuildAndExport() => Run("BuildAndExport", () =>
        {
            StarterSampleBuilder.Build(false);
            var output = Argument("-majacloudOutput") ?? System.IO.Path.Combine(System.IO.Directory.GetParent(Application.dataPath)?.FullName ?? ".", MajacloudPackageExporter.DefaultFileName);
            MajacloudPackageExporter.Export(output);
        });

        private static void Run(string name, Action action)
        {
            try
            {
                Log("Start " + name);
                action();
                AssetDatabase.SaveAssets();
                Log("Done " + name);
            }
            catch (Exception e)
            {
                Debug.LogError("[Majacloud][Batch] " + name + " failed: " + e);
                if (Application.isBatchMode) EditorApplication.Exit(1);
                throw;
            }
        }

        private static void Log(string message) => Debug.Log("[Majacloud][Batch] " + message);

        private static string Argument(string name)
        {
            var args = Environment.GetCommandLineArgs();
            for (int i = 0; i < args.Length - 1; i++)
            {
                if (string.Equals(args[i], name, StringComparison.OrdinalIgnoreCase)) return args[i + 1];
            }
            return null;
        }
    }
}
