using UnityEngine;
using UnityEngine.UIElements;

/// <summary>
/// Setup script to configure all UI systems in the map scene.
/// Handles both travel system and team overview setup automatically.
/// </summary>
public class MapSceneSetup : MonoBehaviour
{
    [Header("Setup Options")]
    public bool autoSetupOnStart = true;
    public bool showDebugLogs = true;

    [Header("UI Settings")]
    public bool enableTeamOverview = true;
    public bool enableTravelSystem = true;

    void Start()
    {
        if (autoSetupOnStart)
        {
            SetupMapScene();
        }
    }

    [ContextMenu("Setup Map Scene")]
    public void SetupMapScene()
    {
        // Check if we're in Play Mode
        if (!Application.isPlaying)
        {
            Debug.LogWarning("⚠️ MapSceneSetup: Please run this setup during Play Mode, not Edit Mode!");
            Debug.LogWarning("💡 Either enter Play Mode and try again, or let it run automatically via autoSetupOnStart.");
            return;
        }

        if (showDebugLogs)
        {
            Debug.Log("🏗️ Setting up Map Scene UI systems...");
        }

        // Setup team overview if enabled
        if (enableTeamOverview)
        {
            SetupTeamOverview();
        }

        // Setup travel system if enabled
        if (enableTravelSystem)
        {
            SetupTravelSystem();
        }

        // Setup quest system
        SetupQuestSystem();

        if (showDebugLogs)
        {
            Debug.Log("✅ Map Scene setup complete!");
        }
    }

    [ContextMenu("Force Setup (Play Mode Only)")]
    public void ForceSetupInPlayMode()
    {
        if (!Application.isPlaying)
        {
            Debug.LogError("❌ This setup requires Play Mode! Enter Play Mode first.");
            return;
        }

        SetupMapScene();
    }

    /// <summary>
    /// Sets up the team overview controller
    /// </summary>
    private void SetupTeamOverview()
    {
        // Look for UI GameObject
        GameObject uiGameObject = GameObject.Find("UI");
        if (uiGameObject == null)
        {
            if (showDebugLogs)
            {
                Debug.LogWarning("⚠️ No UI GameObject found - Team Overview not setup");
            }
            return;
        }

        // Check if TeamOverviewController already exists
        var existingController = FindFirstObjectByType<TeamOverviewController>();
        if (existingController != null)
        {
            if (showDebugLogs)
            {
                Debug.Log("📋 TeamOverviewController already exists");
            }
            return;
        }

        // Create a new GameObject for the TeamOverviewController
        GameObject teamOverviewObject = new GameObject("TeamOverviewController");
        teamOverviewObject.transform.SetParent(uiGameObject.transform);

        // Add the TeamOverviewController component
        var teamOverviewController = teamOverviewObject.AddComponent<TeamOverviewController>();

        if (showDebugLogs)
        {
            Debug.Log("✅ TeamOverviewController created and setup");
        }
    }

    /// <summary>
    /// Sets up the travel system (delegates to existing setup if available)
    /// </summary>
    private void SetupTravelSystem()
    {
        var travelSystemSetup = FindFirstObjectByType<TravelSystemSetup>();
        if (travelSystemSetup != null)
        {
            if (showDebugLogs)
            {
                Debug.Log("🚗 Using existing TravelSystemSetup");
            }
            // Let the existing travel system setup handle this
            return;
        }

        // Look for UI GameObject
        GameObject uiGameObject = GameObject.Find("UI");
        if (uiGameObject == null)
        {
            if (showDebugLogs)
            {
                Debug.LogWarning("⚠️ No UI GameObject found - Travel System not setup");
            }
            return;
        }

        // Check if TravelUIController already exists
        var existingUIController = uiGameObject.GetComponent<TravelUIController>();
        if (existingUIController != null)
        {
            if (showDebugLogs)
            {
                Debug.Log("🚗 TravelUIController already exists");
            }
            return;
        }

        // Add TravelUIController to UI GameObject
        var uiController = uiGameObject.AddComponent<TravelUIController>();
        uiController.showDebugLogs = showDebugLogs;

        if (showDebugLogs)
        {
            Debug.Log("✅ TravelUIController created and setup");
        }
    }

    /// <summary>
    /// Sets up the quest system and ensures quest data is loaded
    /// </summary>
    private void SetupQuestSystem()
    {
        if (showDebugLogs)
        {
            Debug.Log("🗺️ Setting up Quest System for Map Scene...");
        }

        // Ensure QuestManager exists and loads quest data
        if (QuestManager.Instance != null)
        {
            QuestManager.Instance.LoadQuestData();

            if (showDebugLogs)
            {
                var activeQuests = QuestManager.Instance.GetActiveQuests();
                Debug.Log($"✅ Quest system ready - {activeQuests.Count} active quest(s)");
            }
        }
        else
        {
            if (showDebugLogs)
            {
                Debug.LogWarning("⚠️ QuestManager not found in scene");
            }
        }

        // Ensure quest markers are refreshed
        var questMapMarkerManager = FindFirstObjectByType<QuestMapMarkerManager>();
        if (questMapMarkerManager != null)
        {
            questMapMarkerManager.RefreshAllMarkers();

            if (showDebugLogs)
            {
                Debug.Log("✅ Quest markers refreshed");
            }
        }
        else
        {
            if (showDebugLogs)
            {
                Debug.LogWarning("⚠️ QuestMapMarkerManager not found in scene");
            }
        }

        // Ensure ActiveQuestUI is refreshed
        var activeQuestUI = FindFirstObjectByType<ActiveQuestUI>();
        if (activeQuestUI != null)
        {
            // The ActiveQuestUI should automatically refresh via events
            if (showDebugLogs)
            {
                Debug.Log("✅ ActiveQuestUI found and will auto-refresh");
            }
        }
        else
        {
            // Create ActiveQuestUI if it doesn't exist
            SetupActiveQuestUI();
        }
    }

    /// <summary>
    /// Sets up the ActiveQuestUI component
    /// </summary>
    private void SetupActiveQuestUI()
    {
        if (showDebugLogs)
        {
            Debug.Log("🎯 Setting up ActiveQuestUI...");
        }

        // Look for or create a QuestUI GameObject
        GameObject questUIGameObject = GameObject.Find("QuestUI");
        if (questUIGameObject == null)
        {
            questUIGameObject = new GameObject("QuestUI");
        }

        // Check if ActiveQuestUI already exists
        var existingActiveQuestUI = questUIGameObject.GetComponent<ActiveQuestUI>();
        if (existingActiveQuestUI != null)
        {
            if (showDebugLogs)
            {
                Debug.Log("✅ ActiveQuestUI component already exists");
            }
            return;
        }

        // Add UIDocument if it doesn't exist
        var uiDocument = questUIGameObject.GetComponent<UIDocument>();
        if (uiDocument == null)
        {
            uiDocument = questUIGameObject.AddComponent<UIDocument>();
        }

        // Load the UXML asset
        var activeQuestUIAsset = Resources.Load<VisualTreeAsset>("UI/MapScene/ActiveQuestUI");
        if (activeQuestUIAsset != null)
        {
            uiDocument.visualTreeAsset = activeQuestUIAsset;

            if (showDebugLogs)
            {
                Debug.Log("✅ Loaded ActiveQuestUI.uxml");
            }
        }
        else
        {
            Debug.LogError("❌ Could not load ActiveQuestUI.uxml from Resources/UI/MapScene/");
            return;
        }

        // Load the USS asset
        var activeQuestUIStyleSheet = Resources.Load<StyleSheet>("UI/MapScene/ActiveQuestUI");
        if (activeQuestUIStyleSheet != null)
        {
            uiDocument.rootVisualElement.styleSheets.Add(activeQuestUIStyleSheet);

            if (showDebugLogs)
            {
                Debug.Log("✅ Loaded ActiveQuestUI.uss");
            }
        }
        else
        {
            Debug.LogWarning("⚠️ Could not load ActiveQuestUI.uss from Resources/UI/MapScene/");
        }

        // Add the ActiveQuestUI component
        var activeQuestUI = questUIGameObject.AddComponent<ActiveQuestUI>();
        activeQuestUI.uiDocument = uiDocument;

        if (showDebugLogs)
        {
            Debug.Log("✅ ActiveQuestUI component created and configured");
        }
    }

    /// <summary>
    /// Context menu methods for debugging
    /// </summary>
    [ContextMenu("Setup Team Overview Only")]
    public void SetupTeamOverviewOnly()
    {
        SetupTeamOverview();
    }

    [ContextMenu("Setup Travel System Only")]
    public void SetupTravelSystemOnly()
    {
        SetupTravelSystem();
    }

    [ContextMenu("Setup Quest System Only")]
    public void SetupQuestSystemOnly()
    {
        SetupQuestSystem();
    }

    [ContextMenu("Setup ActiveQuestUI Only")]
    public void SetupActiveQuestUIOnly()
    {
        SetupActiveQuestUI();
    }

    [ContextMenu("Verify UI Setup")]
    public void VerifyUISetup()
    {
        var uiGameObject = GameObject.Find("UI");
        var questUIGameObject = GameObject.Find("QuestUI");

        if (uiGameObject == null)
        {
            Debug.LogError("❌ UI GameObject not found!");
            return;
        }

        var uiDocument = uiGameObject.GetComponent<UIDocument>();
        var teamOverviewController = FindFirstObjectByType<TeamOverviewController>();
        var travelUIController = uiGameObject.GetComponent<TravelUIController>();
        var activeQuestUI = FindFirstObjectByType<ActiveQuestUI>();

        Debug.Log($"🔍 UI Setup Verification:");
        Debug.Log($"   UIDocument: {(uiDocument != null ? "✅" : "❌")}");
        Debug.Log($"   TeamOverviewController: {(teamOverviewController != null ? "✅" : "❌")}");
        Debug.Log($"   TravelUIController: {(travelUIController != null ? "✅" : "❌")}");
        Debug.Log($"   ActiveQuestUI: {(activeQuestUI != null ? "✅" : "❌")}");
        Debug.Log($"   QuestUI GameObject: {(questUIGameObject != null ? "✅" : "❌")}");

        if (uiDocument?.rootVisualElement != null)
        {
            var root = uiDocument.rootVisualElement;
            var teamOverviewPanel = root.Q("TeamOverviewPanel");
            var travelContainer = root.Q("TravelContainer");

            Debug.Log($"   TeamOverviewPanel in UXML: {(teamOverviewPanel != null ? "✅" : "❌")}");
            Debug.Log($"   TravelContainer in UXML: {(travelContainer != null ? "✅" : "❌")}");
        }

        if (activeQuestUI?.uiDocument?.rootVisualElement != null)
        {
            var questRoot = activeQuestUI.uiDocument.rootVisualElement;
            var questTracker = questRoot.Q("quest-tracker");

            Debug.Log($"   Quest Tracker in UXML: {(questTracker != null ? "✅" : "❌")}");
        }
    }
}
