using System.IO;
using System.Linq;
using UnityEngine;
using UnityEngine.SceneManagement;


namespace IngameReveries
{
    // ModBehaviour will be instantiated and attached as a component in a container game object named <Your Mod ID>
    // Multiple ModBehaviours in your mod will share the same container.
    public class IngameReveries : ModBehaviour
    {
        private GameObject _ingameReveriesUI;
        
        private AssetBundle _reveriesBundle;
        private GameObject _reveriesPrefab;

        private void Awake()
        {
            // Metadata of your mod is stored in this.about
            Debug.Log("Hola! I'm loaded! " + mod.metadata.id);

            // If you need to patch with Harmony, you can use this.harmony to access the Harmony instance for your mod.
            // It will be created with your mod's id automatically, the first time you access the property.
            harmony.PatchAll();
        }

        private void Start()
        {
            InitializeAssets();
            
            SceneManager.sceneLoaded += (scene, mode) =>
            {
                // Check if UI already instantiated
                if (_ingameReveriesUI != null)
                {
                    return;
                }

                string gameSceneDir = "Assets/Dew/Zones/";
                string relativeToScene = Path.GetRelativePath(gameSceneDir, scene.path);

                if (!relativeToScene.StartsWith(".."))
                {
                    Debug.Log($"[IngameReveries] Switched to scene inside {gameSceneDir}");
                    
                    GameObject menuViewGO = GameObject.Find("GameLogicPackage/UI/InGame/UI_Common_MenuView");
                    if (menuViewGO == null)
                    {
                        Debug.Log("Couldn't find menu view");
                        return;
                    }

                    _ingameReveriesUI = new GameObject("IngameReveriesUI");
                    _ingameReveriesUI.transform.parent = menuViewGO.transform;
                    Instantiate(DewGUI.widgetWindow, _ingameReveriesUI.transform);
                }
            };
        }

        private void OnDestroy()
        {
            // Make sure you clean up properly to support Live Reload.
            Debug.Log("Good bye! " + mod.metadata.id);
            harmony.UnpatchAll();
        }

        private void InitializeAssets()
        {
            string bundlePath = Path.Combine(mod.path, "assets", "bundle");
            
            if (!File.Exists(bundlePath))
            {
                Debug.LogError($"[IngameReveries] Bundle not found at: {bundlePath}");
                return;
            }

            _reveriesBundle = AssetBundle.GetAllLoadedAssetBundles()
                .FirstOrDefault(b => b.name == "logosteal" || b.mainAsset != null);

            if (_reveriesBundle == null)
            {
                // If it isn't loaded yet, load it from disk
                Debug.Log("[IngameReveries] Loading Bundle");
                _reveriesBundle = AssetBundle.LoadFromFile(bundlePath);
            }
            else
            {
                Debug.Log("[IngameReveries] Bundle already loaded");
            }

            if (_reveriesBundle == null)
            {
                Debug.LogError("[IngameReveries] Failed to load AssetBundle!");
                return;
            }

            // Load the prefab from the bundle
            string assetName = _reveriesBundle.GetAllAssetNames().First();
            _reveriesPrefab = _reveriesBundle.LoadAsset<GameObject>(assetName);

            if (_reveriesPrefab == null)
            {
                Debug.LogError("[IngameReveries] Failed to load prefab!");
                
                // List what's in the bundle for debugging
                string[] assetNames = _reveriesBundle.GetAllAssetNames();
                Debug.Log("[IngameReveries] Assets in bundle:");
                foreach (string name in assetNames)
                {
                    Debug.Log($"  - {name}");
                }
                return;
            }

            Debug.Log("[IngameReveries] Successfully loaded prefab!");
        }
    }
}