using UnityEngine;
using UnityEngine.UI;
using Shooter.Gameplay;

namespace Shooter.UI
{
    /// <summary>
    /// Игровой интерфейс (HUD): счётчик кристаллов, здоровье игрока и босса, маркер
    /// автоприцела, название текущего оружия и индикатор активной способности.
    /// Singleton — доступен через <see cref="m_Main"/>.
    /// </summary>
    public class UI_HUD : MonoBehaviour
    {
        public static UI_HUD m_Main;

        [Header("Общие элементы")]
        public Image m_DamageOverlay;
        public Text[] m_PlayerTexts_1;
        public Text m_GemCountText;
        public Text m_GunNameText;
        public Image m_AimTargetImage;
        public RectTransform m_MainCanvas;

        [Header("Полоски здоровья / усиления")]
        public Image m_WeaponPowerTime;
        public Image m_PlayerHealth;
        [Space]
        public Image m_BossHealthBase;
        public Image m_BossHealth;

        [Header("Способность")]
        public Image m_PowerBase;
        public Image m_PowerBar;
        public Text m_PowerNameText;
        public Text m_PowerAmountText;

        [Tooltip("Названия оружия по номеру. Боевые сейчас только 0–1; 2–3 — задел под расширение")]
        public string[] m_WeaponNames = new string[4] { "PISTOL", "SHOTGUN", "MACHINGUN", "PLASMA GUN" };

        void Awake()
        {
            m_Main = this;
        }

        void Start()
        {
            m_BossHealthBase.gameObject.SetActive(false);
        }

        void Update()
        {
            PlayerChar player = PlayerChar.m_Current;

            m_GemCountText.text = PlayerControl.MainPlayerController.m_GemCount.ToString();

            // Маркер автоприцела над текущей целью игрока.
            if (player.m_TempTarget != null)
            {
                m_AimTargetImage.gameObject.SetActive(true);
                Vector3 v = CameraControl.m_Current.m_MyCamera.WorldToScreenPoint(player.m_TempTarget.m_TargetCenter.position);
                v.x = m_MainCanvas.sizeDelta.x * (v.x / Screen.width);
                v.y = m_MainCanvas.sizeDelta.y * (v.y / Screen.height);
                m_AimTargetImage.rectTransform.anchoredPosition = Helper.ToVector2(v);
            }
            else
            {
                m_AimTargetImage.gameObject.SetActive(false);
            }

            // Таймер усиления оружия (16 сек — ср. PlayerChar.m_WeaponPowerDuration).
            m_WeaponPowerTime.fillAmount = player.m_WpnPowerTime / 16f;

            // Здоровье игрока.
            DamageControl damage = player.GetComponent<DamageControl>();
            m_PlayerHealth.fillAmount = damage.Damage / damage.MaxDamage;

            m_GunNameText.text = m_WeaponNames[player.m_WeaponNum];

            // Здоровье босса, если он есть на уровне.
            if (GameControl.m_Current.m_LevelBoss != null)
            {
                damage = GameControl.m_Current.m_LevelBoss.GetComponent<DamageControl>();
                m_BossHealth.fillAmount = damage.Damage / damage.MaxDamage;
            }

            // Индикатор активной способности.
            PlayerPowers p = player.GetComponent<PlayerPowers>();
            if (p.m_HavePower)
            {
                m_PowerBase.gameObject.SetActive(true);
                switch (p.m_PowerNum)
                {
                    case 0:
                        m_PowerNameText.text = "Grenade";
                        m_PowerAmountText.gameObject.SetActive(true);
                        m_PowerAmountText.text = p.m_AmmoCount.ToString();
                        m_PowerBar.gameObject.SetActive(false);
                        break;
                    case 1:
                        m_PowerNameText.text = "Bomb";
                        m_PowerAmountText.gameObject.SetActive(true);
                        m_PowerAmountText.text = p.m_AmmoCount.ToString();
                        m_PowerBar.gameObject.SetActive(false);
                        break;
                }
            }
            else
            {
                m_PowerBase.gameObject.SetActive(false);
            }
        }

        public void ShowBossHealth() => m_BossHealthBase.gameObject.SetActive(true);
        public void HideBossHealth() => m_BossHealthBase.gameObject.SetActive(false);
    }
}
