// Copyright (c) 2026 EzAdmin. All rights reserved.
// Client code, licensed under LICENSE-CLIENT.txt.

using UnityEditor;
using UnityEditor.Build;
using UnityEditor.Build.Reporting;
using UnityEngine;

namespace EzAdmin.EditorTools
{
    public sealed class EzAdminBuildGuard : IPreprocessBuildWithReport
    {
        public int callbackOrder => -1000;

        public void OnPreprocessBuild(BuildReport report)
        {
            if (EditorUserBuildSettings.development) return;
#if EZADMIN_ALLOW_MONO
            return;
#else
            BuildTargetGroup group = BuildPipeline.GetBuildTargetGroup(report.summary.platform);
            if (group == BuildTargetGroup.WebGL) return;
            if (PlayerSettings.GetScriptingBackend(group) != ScriptingImplementation.Mono2x) return;
            throw new BuildFailedException(
                "EzAdmin: this release build uses Mono, which ships your game's code as plain DLLs anyone can open " +
                "and dump. Use Tools > EzAdmin > Protect Build (switches to IL2CPP with full code stripping), or add " +
                "EZADMIN_ALLOW_MONO to Scripting Define Symbols to build anyway.");
#endif
        }

        [MenuItem("Tools/EzAdmin/Protect Build", false, 20)]
        [MenuItem("Window/EzAdmin/Protect Build", false, 20)]
        public static void ProtectBuild()
        {
            BuildTargetGroup group = EditorUserBuildSettings.selectedBuildTargetGroup;
            if (group == BuildTargetGroup.WebGL)
            {
                EditorUtility.DisplayDialog("EzAdmin", "WebGL is always IL2CPP. Nothing to change.", "OK");
                return;
            }
            PlayerSettings.SetScriptingBackend(group, ScriptingImplementation.IL2CPP);
            PlayerSettings.SetManagedStrippingLevel(group, ManagedStrippingLevel.High);
            PlayerSettings.SetIl2CppCompilerConfiguration(group, Il2CppCompilerConfiguration.Release);
            PlayerSettings.stripEngineCode = true;
            EditorUserBuildSettings.development = false;
            EditorUserBuildSettings.allowDebugging = false;
            EditorUserBuildSettings.connectProfiler = false;
            AssetDatabase.SaveAssets();
            Debug.Log("[EzAdmin] Build protected: IL2CPP, high code stripping, release compiler, no debugging. " +
                      "If stripping removes something your game needs by reflection, list it in a link.xml.");
            EditorUtility.DisplayDialog("EzAdmin",
                "Done. " + group + " now builds with IL2CPP, high code stripping and no script debugging, so the " +
                "game's code ships as native code instead of readable DLLs.", "OK");
        }
    }
}
