using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;

namespace CatsUdonTools.Editor
{
    /// <summary>
    /// 入稿用テンプレート（CatsUdonExporter + 展示範囲ガイド）をアクティブシーンに作る。展示ライトは Export 時に自動で足すためテンプレートには置かない。
    /// 入稿者はアバターを CatsUdonExporter の子に置いて運用する。エディタ時のみ動作し、プレイヤービルドには含まれない
    /// </summary>
    internal static class CatsUdonExporterTemplateAuthoring
    {
        private const string UndoGroupName = "Create CatsUdonExporter";
        private const string FloorName = "Floor";
        private const string FloorGuideName = "FloorGuide";

        // Plane の素のメッシュは 10m 四方なので、展示範囲 4m に合わせて縮小する
        private static readonly Vector3 FloorGuideScale = new Vector3(0.4f, 1f, 0.4f);

        private static readonly Vector3 GuidesLocalPosition = new Vector3(0f, 1f, 0f);

        /// <summary>
        /// アクティブシーンのルートに CatsUdonExporter があればそれを、無ければ作成して返す。どちらも選択状態にする
        /// </summary>
        internal static GameObject CreateOrSelect()
        {
            var existingRoot = FindExistingRoot();
            if (existingRoot != null)
            {
                Selection.activeGameObject = existingRoot;
                return existingRoot;
            }

            var root = CreateTemplate();
            EditorSceneManager.MarkSceneDirty(root.scene);
            Selection.activeGameObject = root;
            return root;
        }

        private static GameObject FindExistingRoot()
        {
            var rootObjects = EditorSceneManager.GetActiveScene().GetRootGameObjects();
            foreach (var rootObject in rootObjects)
            {
                if (rootObject.name == CatsUdonExporterBuilder.RootName)
                {
                    return rootObject;
                }
            }

            return null;
        }

        private static GameObject CreateTemplate()
        {
            var root = new GameObject(CatsUdonExporterBuilder.RootName);
            Undo.RegisterCreatedObjectUndo(root, UndoGroupName);

            CreateGuides(root.transform);
            return root;
        }

        private static void CreateGuides(Transform root)
        {
            var guides = new GameObject(CatsUdonExporterBuilder.GuidesName);
            // 名前に加えてタグでも除外対象にし、Unity 標準の「ビルドに含めない」意味もそろえる
            guides.tag = CatsUdonExporterBuilder.EditorOnlyTag;
            guides.transform.SetParent(root, false);
            guides.transform.localPosition = GuidesLocalPosition;

            CreateFloor(guides.transform);
            CreateFloorGuide(guides.transform);
        }

        private static void CreateFloor(Transform parent)
        {
            var floor = GameObject.CreatePrimitive(PrimitiveType.Cube);
            floor.name = FloorName;
            floor.transform.SetParent(parent, false);

            floor.GetComponent<MeshRenderer>().enabled = false;
            floor.GetComponent<BoxCollider>().isTrigger = true;
        }

        private static void CreateFloorGuide(Transform parent)
        {
            var floorGuide = GameObject.CreatePrimitive(PrimitiveType.Plane);
            floorGuide.name = FloorGuideName;
            floorGuide.transform.SetParent(parent, false);
            floorGuide.transform.localScale = FloorGuideScale;
        }
    }
}
