﻿

using System;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;
using Object = UnityEngine.Object;

[CanEditMultipleObjects]
[CustomEditor(typeof(KeyboardInfo))]
public class KeyboardInfoEditor : Editor {
	public override void OnInspectorGUI() {
		DrawDefaultInspector();
            
		if (GUILayout.Button("Build AssetBundle")) {
			var assetPackage = (KeyboardInfo)target;
                
			var uniqueID = GUID.Generate();
			GameObject duplicatedAsset = Instantiate(assetPackage.gameObject);
			var prefab = PrefabUtility.SaveAsPrefabAsset(duplicatedAsset, $"Assets/Keyboard_{uniqueID}.prefab", out bool succeeded);

			prefab.name = "KeyboardTemplate";

			if (succeeded)
			{
				try {
					BuildBundleFromAsset(prefab);
				}
				catch (Exception e) {
					Debug.Log(e);
				}

				DestroyImmediate(duplicatedAsset);
				AssetDatabase.DeleteAsset($"Assets/Keyboard_{uniqueID}.prefab");
			}
			else
			{
				Debug.LogError("Failed to create keyboard prefab");
			}
		}
	}

	private static string[] GetAssetAndScenes(params Object[] assets)
	{
		List<string> assetPaths = new List<string>();
		
		foreach (Object asset in assets)
		{
			var deps = AssetDatabase.GetDependencies(AssetDatabase.GetAssetPath(asset));
			foreach (var dep in deps)
			{
				if (!dep.EndsWith("LightingData.asset"))
				{
					switch (Path.GetExtension(dep).ToLower())
					{
						case ".dll":
						case ".cs":
						case ".js":
						case ".unity":
							break;
						default:
							assetPaths.Add(dep);
							break;
					}
				}
			}
		}

		return assetPaths.ToArray();
	}

	private void BuildBundleFromAsset(Object bundle) {
		string[] assets = GetAssetAndScenes(bundle);

		foreach (var asset in assets) {
			Debug.Log("Including Asset: " + asset);
		}

		AssetBundleBuild abb = new AssetBundleBuild
		{
			assetBundleName = "keyboard-custom",
			addressableNames = assets,
			assetNames = assets,
		};
		Directory.CreateDirectory("Keyboard Builds");
		Directory.CreateDirectory("Keyboard Builds/" + ((KeyboardInfo)target).gameObject.name);
		var manifest = BuildPipeline.BuildAssetBundles("Keyboard Builds/" + ((KeyboardInfo)target).gameObject.name, new[] { abb }, 
			BuildAssetBundleOptions.None, 
			BuildTarget.StandaloneWindows);
		foreach (var assetBundleBuild in manifest.GetAllAssetBundles()) {
			Debug.Log("Built Asset Bundle: " + assetBundleBuild);
		}
		// dunno why it makes these two...
		File.Delete("Keyboard Builds/" + ((KeyboardInfo)target).gameObject.name + "/" + ((KeyboardInfo)target).gameObject.name);
		File.Delete("Keyboard Builds/" + ((KeyboardInfo)target).gameObject.name + "/" + ((KeyboardInfo)target).gameObject.name + ".manifest");

		EditorUtility.RevealInFinder("Keyboard Builds/" + ((KeyboardInfo)target).gameObject.name + "/keyboard-custom");
	}
}