//using HybridCLR.Editor;
//using HybridCLR.Editor.Commands;
//using HybridCLR.Editor.Installer;
//using XGame.Editor.Framework.Compiler;
//using Kailash.Framework.Definition;
//using System;
//using System.IO;
//using System.Runtime.InteropServices;
//using UnityEditor;

//namespace XGame.Editor.Build
//{
//    [BuildCommand((uint)BuildCommandPriority.BuildHybridclr)]
//    class CmdBuildHybridclr : BaseBuildCommand, ICommandExecuterAsync
//    {
//        public void Execute()
//        {
//            BuildErrorCode code = BuildErrorCode.CmdCompleted;

//            if (Context.config.scriptImpl != ScriptingImplementation.IL2CPP)
//            {
//                SettingsUtil.Enable = false;
//                this.Completed(code);
//                return;
//            }

//            try
//            {
//                BuildTarget target = EditorUserBuildSettings.activeBuildTarget;

//                DeleteKailashDir();

//                DeleteAOTRoot(target);

//                PrebuildCommand.GenerateAll();

//                CompilerHotfixDlls();

//                MergeAOTAssemblies(target);

//                DeleteTempProj(target);
//            }
//            catch (Exception e)
//            {
//                BuildLog.Error($"CmdBuildHybridclr failed. \nError: {e.Message}\nStackTrace: {e.StackTrace}");
//                code = BuildErrorCode.BuildHybridclrError;
//            }
//            finally
//            {
//                this.Completed(code);
//            }
//        }

//        void DeleteKailashDir()
//        {
//            string dir = FileDefine.KailashDirectory.StreamingPath;
//            if (Directory.Exists(dir))
//                Directory.Delete(dir, true);
//            Directory.CreateDirectory(dir);
//        }

//        void DeleteAOTRoot(BuildTarget target)
//        {
//            var root = Path.Combine(SettingsUtil.ProjectDir, SettingsUtil.GetAssembliesPostIl2CppStripDir(target));

//            if (Directory.Exists(root))
//                Directory.Delete(root, true);

//            Directory.CreateDirectory(root);
//        }

//        void CompilerHotfixDlls()
//        {
//            switch (Context.config.publishType)
//            {
//                case PublishType.Debug:
//                    CompilerEntrance.CompileDebug();
//                    break;
//                case PublishType.Release:
//                case PublishType.Profiler:
//                    CompilerEntrance.CompileRelease();
//                    break;
//                default:
//                    break;
//            }
//        }

//        unsafe void MergeAOTAssemblies(BuildTarget target)
//        {
//            const int INT32_SIZE = 4;

//            var root = Path.Combine(SettingsUtil.ProjectDir, SettingsUtil.GetAssembliesPostIl2CppStripDir(target));
//            var files = Directory.GetFiles(root, "*.dll");
//            var totalSize = 0;
//            totalSize += INT32_SIZE;

//            foreach (var file in files)
//            {
//                totalSize += INT32_SIZE;
//                totalSize += (int)(new FileInfo(file).Length);
//            }

//            var count = files.Length;
//            var metadata = new byte[totalSize];

//            fixed (byte* ptr = metadata)
//            {
//                var pointer = ptr;

//                // write total count;
//                *(int*)pointer = count;
//                pointer += INT32_SIZE;

//                // write any file
//                foreach (var file in files)
//                {
//                    var bytes = File.ReadAllBytes(file);
//                    var length = bytes.Length;

//                    *(int*)pointer = length;
//                    pointer += INT32_SIZE;

//                    Marshal.Copy(bytes, 0, new IntPtr(pointer), length);
//                    pointer += length;
//                }

//                // write kailash.metadata file
//                File.WriteAllBytes(FileDefine.MetadataForAOTAssemblies.StreamingPath, metadata);
//            }
//        }

//        void DeleteTempProj(BuildTarget target)
//        {
//            string tempProject = $"{SettingsUtil.HybridCLRDataDir}/StrippedAOTDllsTempProj/{target}";

//            if (Directory.Exists(tempProject))
//                Directory.Delete(tempProject, true);
//        }
//    }
//}
