// Assets/_Project/Scripts/Dev/DevWaveControls.cs
using Unity.Netcode;
using UnityEngine;
using UnityEngine.InputSystem;
using TD.Gameplay;

namespace TD.Dev
{
    /// <summary>
    /// Editor / testing convenience: shows an OnGUI button in the top-left
    /// corner that force-advances the wave on the server. Add this component
    /// to any GameObject in the scene (e.g. a "DevTools" empty) during testing,
    /// disable or remove for shipping builds.
    /// </summary>
    /// <remarks>
    /// The button calls <see cref="WaveManager.ForceAdvanceToNextWave"/>, which
    /// despawns active enemies, stops the current wave's coroutine, and starts
    /// the next wave with no prep delay.
    ///
    /// Server-side only — the OnGUI button is gated to <c>NetworkManager.IsServer</c>
    /// so clients connected to a remote host don't see it. The hotkey path is
    /// also server-gated to avoid surprising results when pressed on a client.
    /// </remarks>
    public class DevWaveControls : MonoBehaviour
    {
        [Tooltip("Keyboard shortcut to force-advance to the next wave. " +
                 "Uses the new Input System (UnityEngine.InputSystem.Key). " +
                 "Set to Key.None to use the OnGUI button only.")]
        [SerializeField] private Key hotkey = Key.F9;

        [Tooltip("Keyboard shortcut to grant the local player the next catalog tower not " +
                 "yet in their deck. Stand-in for the draft system so deck growth can be " +
                 "verified now. Set to Key.None to use the OnGUI button only.")]
        [SerializeField] private Key grantTowerHotkey = Key.F8;

        private void Update()
        {
            var kb = Keyboard.current;
            if (kb == null) return; // no keyboard connected (e.g. headless server)

            if (hotkey != Key.None && kb[hotkey].wasPressedThisFrame)
                TryForceNextWave();

            if (grantTowerHotkey != Key.None && kb[grantTowerHotkey].wasPressedThisFrame)
                TryGrantNextTower();
        }

        private void OnGUI()
        {
            // Only show the button on the server (host or dedicated). Clients
            // calling this from afar would no-op anyway.
            if (NetworkManager.Singleton == null || !NetworkManager.Singleton.IsServer)
                return;

            // Anchored below the top HUD bar so it doesn't overlap gold/wave/lives.
            const float topOffset = 90f;
            GUI.Box(new Rect(10, topOffset, 180, 95), "Dev: Wave Controls");
            if (GUI.Button(new Rect(20, topOffset + 25, 160, 28), "Force Next Wave"))
                TryForceNextWave();
            if (GUI.Button(new Rect(20, topOffset + 58, 160, 28), "Grant Next Tower"))
                TryGrantNextTower();
        }

        // Dev stand-in for the draft system: grants the local player the first catalog
        // tower they haven't unlocked yet, so deck growth + the HUD's live rebuild can be
        // verified before the real draft exists. Server-only (host); ServerGrantTower
        // no-ops elsewhere.
        private void TryGrantNextTower()
        {
            if (NetworkManager.Singleton == null || !NetworkManager.Singleton.IsServer)
            {
                Debug.LogWarning("[DevWaveControls] Grant-tower requested off the server. Ignored.");
                return;
            }

            var placement = TowerPlacementManager.Instance;
            var deck = PlayerTowerDeck.Local;
            if (placement == null || deck == null)
            {
                Debug.LogWarning("[DevWaveControls] Cannot grant tower — TowerPlacementManager " +
                                 "or local PlayerTowerDeck is not ready.");
                return;
            }

            foreach (var (def, typeId) in placement.GetAvailableDefinitions())
            {
                if (deck.Contains(typeId)) continue;
                if (deck.ServerGrantTower(typeId))
                    Debug.Log($"[DevWaveControls] Granted '{def.DisplayName}' (typeId {typeId}) " +
                              $"to the local deck.");
                return;
            }

            Debug.Log("[DevWaveControls] Local deck already contains every catalog tower.");
        }

        private void TryForceNextWave()
        {
            if (NetworkManager.Singleton == null || !NetworkManager.Singleton.IsServer)
            {
                Debug.LogWarning("[DevWaveControls] Force-advance requested off the server. Ignored.");
                return;
            }

            var wm = WaveManager.Instance;
            if (wm == null)
            {
                Debug.LogWarning("[DevWaveControls] WaveManager.Instance is null. " +
                                 "Is the scene running with a WaveManager network-spawned?");
                return;
            }

            Debug.Log("[DevWaveControls] Forcing next wave.");
            wm.ForceAdvanceToNextWave();
        }
    }
}
