﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System;
using System.Reflection;
using System.Linq;

namespace Fluff_Toolbox.Models {

    [InitializeOnLoad]
    public static class InitOnLoad {

        public const string DynamicSYMBOL = "DYNAMICBONES_EXISTS";
        public const string VRCSDKSYMBOL = "VRC_SDK_VRCSDK3";
        public const string CVRCCKSYMBOL = "CVR_CCK_EXISTS";

        static InitOnLoad() {
            checkDynamicBones();
        }

        public static void checkDynamicBones() {
            Assembly assembly = null;
            foreach (Assembly a in System.AppDomain.CurrentDomain.GetAssemblies())
                if (a.GetName().Name.Equals("Assembly-CSharp")) {
                    assembly = a;
                    break;
                }

            if (assembly == null) return;

            var defines = PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup);

            Type type = assembly.GetType("DynamicBoneCollider");
            if (type == null) {
                removeSymbol(defines, DynamicSYMBOL);
                return;
            }

            if (!defines.Contains(DynamicSYMBOL))
                PlayerSettings.SetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup, $"{defines};{DynamicSYMBOL}");


        }

        public static void removeSymbol(string defines, string symbol) {

            if (defines.Contains(symbol)) {
                List<string> newDefines = new List<string>();
                string[] s = defines.Split(';');
                foreach (string s2 in s)
                    if (!s2.Equals(symbol))
                        newDefines.Add(s2);

                string joinDefines = string.Join(";", newDefines);
                if (joinDefines != defines)
                    PlayerSettings.SetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup, joinDefines);
            }
        }
    }


    public class Fix : UnityEditor.AssetModificationProcessor {
        static AssetDeleteResult OnWillDeleteAsset(string path, RemoveAssetOptions opt) {

            if (path.ToLower().Contains("dynamicbone")) {
                var defines = PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup);
                InitOnLoad.removeSymbol(defines, InitOnLoad.DynamicSYMBOL);
            }

            if (path.ToLower().Contains("vrcsdk")) {
                var defines = PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup);
                InitOnLoad.removeSymbol(defines, InitOnLoad.VRCSDKSYMBOL);
            }

            if (path.ToLower().Contains("abi.cck")) {
                var defines = PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup);
                InitOnLoad.removeSymbol(defines, InitOnLoad.CVRCCKSYMBOL);
            }

            return AssetDeleteResult.DidNotDelete;
        }
    }
}