using UnityEngine;
using UnityEngine.UI;
using System.Collections.Generic;

/// <summary>
/// Auto-setup script to configure the game scene.
/// Drag this onto an empty GameObject called "GameManager" to auto-configure everything.
/// </summary>
public class GameSetup : MonoBehaviour
{
    [Header("Player Setup")]
    [Tooltip("The T-Rex player prefab or create one")]
    public GameObject trexPrefab;
    
    [Tooltip("Auto-create a basic T-Rex")]
    public bool createBasicTrex = true;
    
    [Tooltip("Spawn position for player")]
    public Vector3 playerSpawnPos = Vector3.zero;

    [Header("World")]
    [Tooltip("Generate terrain automatically")]
    public bool generateTerrain = true;
    
    [Tooltip("Add skybox")]
    public bool addSkybox = true;

    [Header("Lighting")]
    [Tooltip("Add directional light")]
    public bool addDirectionalLight = true;

    [Header("Enemies")]
    [Tooltip("Auto-create enemy dinosaurs")]
    public bool createEnemies = true;
    
    [Tooltip("Number of enemy dinosaurs")]
    public int enemyCount = 5;
    
    [Tooltip("Enemy spawn radius from player")]
    public float enemySpawnRadius = 50f;

    [Header("UI")]
    [Tooltip("Create basic health bar UI")]
    public bool createHealthBarUI = true;

    void Start()
    {
        Debug.Log("🎮 Setting up Super Dino Smash...");

        SetupLighting();
        SetupWorld();
        SetupPlayer();
        SetupEnemies();
        SetupUI();

        Debug.Log("✅ Setup complete! Press Play to start the game.");
    }

    void SetupLighting()
    {
        if (addDirectionalLight)
        {
            // Check if directional light exists
            if (FindAnyObjectByType<Light>() == null)
            {
                GameObject sun = new GameObject("Sun");
                Light dirLight = sun.AddComponent<Light>();
                dirLight.type = LightType.Directional;
                dirLight.color = Color.white;
                dirLight.intensity = 1f;
                dirLight.transform.rotation = Quaternion.Euler(50f, 30f, 0f);
                
                // Add shadows (Unity 6 compatible)
                dirLight.shadows = LightShadows.Soft;
                
                Debug.Log("☀️ Added directional light");
            }
        }

        // Setup ambient light (Unity 6 compatible)
        RenderSettings.ambientMode = UnityEngine.Rendering.AmbientMode.Flat;
        RenderSettings.fog = true;
        RenderSettings.fogColor = new Color(0.5f, 0.6f, 0.7f);
        RenderSettings.fogMode = FogMode.Exponential;
        RenderSettings.fogStartDistance = 30f;
        RenderSettings.fogEndDistance = 120f;
    }

    void SetupWorld()
    {
        if (generateTerrain)
        {
            // Check if terrain exists
            if (FindAnyObjectByType<Terrain>() == null)
            {
                GameObject terrainObj = new GameObject("Terrain");
                Terrain terrain = terrainObj.AddComponent<Terrain>();
                
                TerrainData terrainData = new TerrainData();
                terrainData.heightmapResolution = 257;
                terrainData.size = new Vector3(512, 20, 512);
                terrain.terrainData = terrainData;
                
                Debug.Log("🌍 Created basic terrain");
            }
        }

        if (addSkybox)
        {
            // Use default skybox or set a color
            RenderSettings.skybox = Resources.Load<Material>("Skybox");
            if (RenderSettings.skybox == null)
            {
                // Fallback to blue sky
                RenderSettings.skybox = null;
                // Use default sky
            }
        }

        // Add ground plane if no terrain
        if (FindAnyObjectByType<Terrain>() == null)
        {
            GameObject ground = GameObject.CreatePrimitive(PrimitiveType.Plane);
            ground.name = "Ground";
            ground.transform.position = Vector3.zero;
            ground.transform.localScale = new Vector3(50f, 50f, 50f);
            
            Debug.Log("🟫 Created ground plane");
        }
    }

    void SetupPlayer()
    {
        if (createBasicTrex || trexPrefab == null)
        {
            CreateBasicTrex();
        }
        else
        {
            Instantiate(trexPrefab, playerSpawnPos, Quaternion.identity);
        }
    }

    void CreateBasicTrex()
    {
        // Create T-Rex GameObject
        GameObject trex = new GameObject("T-Rex");
        trex.tag = "Player";
        trex.transform.position = playerSpawnPos;

        // Add capsule body
        GameObject body = GameObject.CreatePrimitive(PrimitiveType.Capsule);
        body.name = "Body";
        body.transform.SetParent(trex.transform);
        body.transform.localPosition = Vector3.zero;
        body.transform.localScale = new Vector3(1f, 2f, 1f);
        
        // Green material
        Material greenMat = new Material(Shader.Find("Standard"));
        greenMat.color = Color.green;
        body.GetComponent<Renderer>().material = greenMat;

        // Remove collider from body (CharacterController handles this)
        Destroy(body.GetComponent<Collider>());

        // Add components
        CharacterController controller = trex.AddComponent<CharacterController>();
        controller.height = 3f;
        controller.radius = 0.8f;

        TrexController playerController = trex.AddComponent<TrexController>();
        
        CombatSystem combat = trex.AddComponent<CombatSystem>();
        combat.maxHealth = 100f;
        combat.biteDamage = 25f;

        // Note: Add Animator component manually in Unity with an Animator Controller
        // trex.AddComponent<Animator>();

        Debug.Log("🦖 Created T-Rex player at " + playerSpawnPos);
    }

    void SetupEnemies()
    {
        if (!createEnemies) return;

        Debug.Log($"🌋 Creating {enemyCount} enemy dinosaurs...");

        // Create a spawn manager
        GameObject spawner = new GameObject("DinoSpawnManager");
        DinoSpawnManager spawnManager = spawner.AddComponent<DinoSpawnManager>();
        spawnManager.maxDinos = enemyCount;
        spawnManager.useRandomSpawn = true;
        spawnManager.spawnRadius = enemySpawnRadius;
        spawnManager.spawnCenter = playerSpawnPos;

        // Create enemy dino prefabs
        List<GameObject> enemyPrefabs = new List<GameObject>();

        // Raptor type (fast, small)
        GameObject raptor = CreateBasicEnemyDino("Raptor", Color.red, 0.8f, 1.5f, 50f, 10f);
        enemyPrefabs.Add(raptor);

        // Stegosaurus type (medium, tanky)
        GameObject stego = CreateBasicEnemyDino("Stegosaurus", Color.yellow, 1.2f, 2.5f, 100f, 15f);
        enemyPrefabs.Add(stego);

        // Triceratops type (large, slow)
        GameObject trike = CreateBasicEnemyDino("Triceratops", Color.cyan, 1.5f, 3f, 150f, 20f);
        enemyPrefabs.Add(trike);

        spawnManager.dinoPrefabs = enemyPrefabs.ToArray();

        // Spawn initial wave immediately
        for (int i = 0; i < enemyCount; i++)
        {
            GameObject prefab = enemyPrefabs[i % enemyPrefabs.Count];
            float angle = (i * 360f / enemyCount) * Mathf.Deg2Rad;
            float radius = Random.Range(20f, enemySpawnRadius);

            Vector3 spawnPos = new Vector3(
                playerSpawnPos.x + Mathf.Cos(angle) * radius,
                1f,
                playerSpawnPos.z + Mathf.Sin(angle) * radius
            );

            GameObject dino = Instantiate(prefab, spawnPos, Quaternion.identity);
            Debug.Log($"🦕 Spawned {dino.name} at {spawnPos:F1}");
        }

        Debug.Log($"✅ Created {enemyCount} enemy dinosaurs!");
    }

    GameObject CreateBasicEnemyDino(string name, Color color, float scale, float height, float health, float damage)
    {
        GameObject dino = new GameObject(name);
        dino.tag = "Enemy";
        dino.layer = LayerMask.NameToLayer("Default");

        // Body
        GameObject body = GameObject.CreatePrimitive(PrimitiveType.Capsule);
        body.name = "Body";
        body.transform.SetParent(dino.transform);
        body.transform.localPosition = Vector3.zero;
        body.transform.localScale = new Vector3(scale, height, scale);

        Material mat = new Material(Shader.Find("Standard"));
        mat.color = color;
        body.GetComponent<Renderer>().material = mat;

        // Remove collider (we'll add our own)
        Destroy(body.GetComponent<Collider>());

        // Add Rigidbody for physics
        Rigidbody rb = dino.AddComponent<Rigidbody>();
        rb.mass = 2f * scale;
        rb.useGravity = true;
        rb.freezeRotation = true;

        // Add capsule collider for combat detection
        CapsuleCollider collider = dino.AddComponent<CapsuleCollider>();
        collider.height = height;
        collider.radius = scale * 0.5f;
        collider.isTrigger = true;

        // Add AI controller
        AIController ai = dino.AddComponent<AIController>();
        ai.attackRange = 5f;
        ai.walkSpeed = 4f;
        ai.chaseSpeed = 7f;

        // Add combat system
        CombatSystem combat = dino.AddComponent<CombatSystem>();
        combat.maxHealth = health;
        combat.biteDamage = damage;

        return dino;
    }

    void SetupUI()
    {
        if (createHealthBarUI)
        {
            // Create canvas
            if (FindAnyObjectByType<Canvas>() == null)
            {
                GameObject canvas = new GameObject("Canvas");
                Canvas c = canvas.AddComponent<Canvas>();
                c.renderMode = RenderMode.ScreenSpaceOverlay;
                
                canvas.AddComponent<CanvasScaler>();
                canvas.AddComponent<GraphicRaycaster>();
            }

            // Create health bar background
            GameObject healthBarBG = new GameObject("HealthBarBackground");
            healthBarBG.transform.SetParent(FindAnyObjectByType<Canvas>().transform);
            
            RectTransform rect = healthBarBG.AddComponent<RectTransform>();
            rect.anchorMin = new Vector2(0, 1);
            rect.anchorMax = new Vector2(0, 1);
            rect.anchoredPosition = new Vector2(20f, -20f);
            rect.sizeDelta = new Vector2(200f, 20f);
            
            Image bgImage = healthBarBG.AddComponent<Image>();
            bgImage.color = new Color(1f, 1f, 1f, 0.3f);

            // Create health bar fill
            GameObject healthFill = new GameObject("HealthFill");
            healthFill.transform.SetParent(healthBarBG.transform);
            
            RectTransform fillRect = healthFill.AddComponent<RectTransform>();
            fillRect.anchorMin = Vector2.zero;
            fillRect.anchorMax = Vector2.one;
            fillRect.anchoredPosition = Vector2.zero;
            fillRect.sizeDelta = Vector2.zero;
            
            Image fillImage = healthFill.AddComponent<Image>();
            fillImage.color = Color.green;
            fillImage.type = Image.Type.Filled;
            fillImage.fillMethod = Image.FillMethod.Horizontal;
            fillImage.fillOrigin = 2;
            fillImage.fillAmount = 1f;

            // Add health bar controller to canvas
            HealthBarController healthController = FindAnyObjectByType<Canvas>().gameObject.AddComponent<HealthBarController>();
            healthController.healthBarFill = fillImage;
            healthController.healthBarBackground = bgImage;

            Debug.Log("❤️ Created health bar UI");
        }
    }
}