using UnityEditor;
using UnityEngine;

namespace AlterchaseSDK.Editor
{
    public static class CreatePlayerSpawnPrefab
    {
        private const string PREFAB_PATH = "Assets/Scripts/AlterchaseSDK/AssetBoxAssets/PlayerSpawnReference.prefab";

        [MenuItem("Alterchase SDK/Create Player Spawn Prefab", priority = 100)]
        public static void CreatePrefab()
        {
            if (AssetDatabase.LoadAssetAtPath<GameObject>(PREFAB_PATH) != null)
            {
                bool overwrite = EditorUtility.DisplayDialog(
                    "Prefab Already Exists",
                    "The PlayerSpawnReference prefab already exists. Do you want to recreate it?",
                    "Recreate",
                    "Cancel"
                );

                if (!overwrite)
                    return;
            }

            string folderPath = "Assets/Scripts/AlterchaseSDK/AssetBoxAssets";
            if (!AssetDatabase.IsValidFolder(folderPath))
            {
                string[] pathParts = folderPath.Split('/');
                string currentPath = pathParts[0];
                
                for (int i = 1; i < pathParts.Length; i++)
                {
                    string nextPath = currentPath + "/" + pathParts[i];
                    
                    if (!AssetDatabase.IsValidFolder(nextPath))
                    {
                        AssetDatabase.CreateFolder(currentPath, pathParts[i]);
                    }
                    
                    currentPath = nextPath;
                }
            }

            GameObject prefabRoot = new GameObject("PlayerSpawnReference");
            prefabRoot.AddComponent<PlayerSpawnReference>();

            GameObject visual = new GameObject("Visual");
            visual.transform.SetParent(prefabRoot.transform);
            visual.transform.localPosition = Vector3.zero;
            visual.transform.localRotation = Quaternion.identity;

            GameObject platform = GameObject.CreatePrimitive(PrimitiveType.Cylinder);
            platform.name = "Platform";
            platform.transform.SetParent(visual.transform);
            platform.transform.localPosition = new Vector3(0, 0.05f, 0);
            platform.transform.localRotation = Quaternion.identity;
            platform.transform.localScale = new Vector3(1.5f, 0.05f, 1.5f);

            MeshRenderer platformRenderer = platform.GetComponent<MeshRenderer>();
            Material platformMat = new Material(Shader.Find("Standard"));
            platformMat.color = new Color(0.2f, 0.7f, 1f, 1f);
            platformMat.SetFloat("_Metallic", 0.5f);
            platformMat.SetFloat("_Glossiness", 0.6f);
            platformRenderer.material = platformMat;

            Object.DestroyImmediate(platform.GetComponent<Collider>());

            GameObject arrow = new GameObject("Arrow");
            arrow.transform.SetParent(visual.transform);
            arrow.transform.localPosition = new Vector3(0, 0.15f, 0);
            arrow.transform.localRotation = Quaternion.Euler(-90, 0, 0);
            arrow.AddComponent<AlterchaseSDK.PlayerSpawnRotator>();

            GameObject arrowHead = GameObject.CreatePrimitive(PrimitiveType.Cube);
            arrowHead.name = "ArrowHead";
            arrowHead.transform.SetParent(arrow.transform);
            arrowHead.transform.localPosition = new Vector3(0, 0.6f, 0);
            arrowHead.transform.localRotation = Quaternion.Euler(0, 45, 0);
            arrowHead.transform.localScale = new Vector3(0.3f, 0.3f, 0.3f);

            MeshRenderer arrowHeadRenderer = arrowHead.GetComponent<MeshRenderer>();
            Material arrowMat = new Material(Shader.Find("Standard"));
            arrowMat.color = new Color(1f, 0.8f, 0.2f, 1f);
            arrowMat.SetFloat("_Metallic", 0.3f);
            arrowMat.SetFloat("_Glossiness", 0.7f);
            arrowMat.EnableKeyword("_EMISSION");
            arrowMat.SetColor("_EmissionColor", new Color(1f, 0.8f, 0.2f, 1f) * 0.3f);
            arrowHeadRenderer.material = arrowMat;

            Object.DestroyImmediate(arrowHead.GetComponent<Collider>());

            GameObject cylinder = GameObject.CreatePrimitive(PrimitiveType.Cylinder);
            cylinder.name = "Shaft";
            cylinder.transform.SetParent(arrow.transform);
            cylinder.transform.localPosition = new Vector3(0, 0.2f, 0);
            cylinder.transform.localRotation = Quaternion.identity;
            cylinder.transform.localScale = new Vector3(0.1f, 0.4f, 0.1f);

            MeshRenderer cylinderRenderer = cylinder.GetComponent<MeshRenderer>();
            cylinderRenderer.material = arrowMat;

            Object.DestroyImmediate(cylinder.GetComponent<Collider>());

            for (int i = 0; i < 4; i++)
            {
                GameObject pillar = GameObject.CreatePrimitive(PrimitiveType.Cylinder);
                pillar.name = $"Pillar_{i}";
                pillar.transform.SetParent(visual.transform);

                float angle = i * 90f * Mathf.Deg2Rad;
                Vector3 offset = new Vector3(Mathf.Cos(angle), 0, Mathf.Sin(angle)) * 0.6f;
                pillar.transform.localPosition = offset + new Vector3(0, 0.35f, 0);
                pillar.transform.localRotation = Quaternion.identity;
                pillar.transform.localScale = new Vector3(0.08f, 0.35f, 0.08f);

                MeshRenderer pillarRenderer = pillar.GetComponent<MeshRenderer>();
                Material pillarMat = new Material(Shader.Find("Standard"));
                pillarMat.color = new Color(0.3f, 0.8f, 1f, 1f);
                pillarMat.SetFloat("_Metallic", 0.6f);
                pillarMat.SetFloat("_Glossiness", 0.5f);
                pillarRenderer.material = pillarMat;

                Object.DestroyImmediate(pillar.GetComponent<Collider>());
            }

            PrefabUtility.SaveAsPrefabAsset(prefabRoot, PREFAB_PATH);
            Object.DestroyImmediate(prefabRoot);

            AssetDatabase.Refresh();

            GameObject createdPrefab = AssetDatabase.LoadAssetAtPath<GameObject>(PREFAB_PATH);
            Selection.activeObject = createdPrefab;
            EditorGUIUtility.PingObject(createdPrefab);

            Debug.Log($"PlayerSpawnReference prefab created at: {PREFAB_PATH}");

            EditorUtility.DisplayDialog(
                "Prefab Created",
                "PlayerSpawnReference prefab has been created in the AssetBoxAssets folder!\n\nMod creators can now drag it from the Asset Box into their scenes.",
                "OK"
            );
        }
    }
}
