using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TMPro;
using DG.Tweening;
using NaughtyAttributes;
public class WeaponInfoCanvas : MonoBehaviour
{
    [BoxGroup("Particle Boarder")] [SerializeField] private ParticleSystem mainSystem;
    [BoxGroup("Particle Boarder")] [SerializeField] private ParticleSystem subSystem;

    [BoxGroup("Value Assignments")] [SerializeField] private TMP_Text weaponName;
    [BoxGroup("Value Assignments")] [SerializeField] private TMP_Text weaponDamage;
    [BoxGroup("Value Assignments")] [SerializeField] private TMP_Text weaponCritMultiplier;
    [BoxGroup("Value Assignments")] [SerializeField] private TMP_Text weaponSpread;
    [BoxGroup("Value Assignments")] [SerializeField] private TMP_Text weaponReloadSpeed;
    [BoxGroup("Value Assignments")] [SerializeField] private TMP_Text weaponFireRate;
    [BoxGroup("Value Assignments")] [SerializeField] private TMP_Text weaponMagSize;

    [BoxGroup("Tween Objects")] [SerializeField] private Transform[] childrenToTween;

    [BoxGroup("Statistic Arrows")] [SerializeField] Sprite arrow;
    [BoxGroup("Statistic Arrows")] [SerializeField] Sprite line;

    [BoxGroup("Statistic Arrows")] [SerializeField] Image damageArrow;
    [BoxGroup("Statistic Arrows")] [SerializeField] Image critArrow;
    [BoxGroup("Statistic Arrows")] [SerializeField] Image spreadArrow;
    [BoxGroup("Statistic Arrows")] [SerializeField] Image reloadSpeedArrow;
    [BoxGroup("Statistic Arrows")] [SerializeField] Image fireRateArrow;
    [BoxGroup("Statistic Arrows")] [SerializeField] Image magSizeArrow;

    private Color32 blueRarity = new Color(0, 125, 1, 50f);
    private Color32 purpleRarity = new Color(255f, 0f, 255f, 50f);
    private Color32 redRarity = new Color(255f, 0f, 0f, 50f);
    private Color32 goldRarity = new Color(255f, 255f, 0f, 50f);

    private void OnEnable()
    {
        transform.DOScale(1.5f, 0.2f).SetEase(Ease.InSine);

        float delay = 0.1f;
        foreach (Transform t in childrenToTween) { t.localScale = Vector3.zero; }

        for (int i = 0; i < childrenToTween.Length; i++)
        {
            delay += 0.05f;
            Transform t = childrenToTween[i];
            t.DOScale(1, 0.15f).SetDelay(delay).SetUpdate(true);
        }
    }

    private void OnDisable() => transform.localScale = Vector3.zero;

    public void DisableGameObject()
    {
        transform.DOScale(0, 0.1f).OnComplete(() => gameObject.SetActive(false));
    }

    public void SetWeaponCanvasStats(WeaponUpgradeConfig currentWeaponConfig, Weapon weaponData, int powerLevel, Rarity rarity)
    {
        WeaponUpgradeConfig config = weaponData.UpgradeLevels[powerLevel];

        float damage = config.Damage;
        float critDamage = config.HeadShotDamage;
        float critMultiplier = (critDamage / damage) * 100;
        float reloadMultiplier = 1f / config.ReloadTime;
        float fireRate = 1f / config.FireRate;
        float RPM = fireRate * 60;
        float consumptionRate = config.consumptionRate / weaponData.bulletsPerTap;

        SetOuterGlow(rarity);
        Debug.LogError($"currentWeapon:{currentWeaponConfig}, newWeapon:{weaponData}");

        weaponName.SetText(weaponData.weaponName);
        weaponDamage.SetText($"{damage}");
        weaponCritMultiplier.SetText($"{critMultiplier:F2}%");
        weaponSpread.SetText($"{config.BulletSpread}");
        weaponReloadSpeed.SetText($"{reloadMultiplier:F2}x");
        weaponFireRate.SetText($"{RPM:F0}RPM");
        weaponMagSize.SetText($"{consumptionRate:F2}/Ps");

        float currentWeaponCrit = (float)currentWeaponConfig.HeadShotDamage / (float)currentWeaponConfig.Damage;
        float currentWeaponReload = 1f / currentWeaponConfig.ReloadTime;
        float currentWeaponFireRate = 1f / currentWeaponConfig.FireRate;

        SetStatIndicator(damage, currentWeaponConfig.Damage, damageArrow);
        SetStatIndicator(critMultiplier, currentWeaponCrit, critArrow);
        SetStatIndicator(config.BulletSpread, currentWeaponConfig.BulletSpread, spreadArrow, true);
        SetStatIndicator(reloadMultiplier, currentWeaponReload, reloadSpeedArrow);
        SetStatIndicator(config.FireRate, currentWeaponFireRate, fireRateArrow);
        SetStatIndicator(config.consumptionRate, currentWeaponConfig.consumptionRate, magSizeArrow, true);
    }

    private void SetOuterGlow(Rarity rarity)
    {
        ParticleSystem.MainModule main = mainSystem.main;
        ParticleSystem.MainModule subMain = subSystem.main;
        switch (rarity)
        {
            case Rarity.Common:
                main.startColor = new ParticleSystem.MinMaxGradient(Color.grey);
                subMain.startColor = new ParticleSystem.MinMaxGradient(Color.grey);
                break;
            case Rarity.Rare:
                main.startColor = new ParticleSystem.MinMaxGradient(blueRarity);
                subMain.startColor = new ParticleSystem.MinMaxGradient(blueRarity);
                weaponName.color = blueRarity;
                break;
            case Rarity.VeryRare:
                main.startColor = new ParticleSystem.MinMaxGradient(purpleRarity);
                subMain.startColor = new ParticleSystem.MinMaxGradient(purpleRarity);
                weaponName.color = purpleRarity;
                break;
            case Rarity.Epic:
                main.startColor = new ParticleSystem.MinMaxGradient(redRarity);
                subMain.startColor = new ParticleSystem.MinMaxGradient(redRarity);
                weaponName.color = redRarity;
                break;
            case Rarity.Legendary:
                main.startColor = new ParticleSystem.MinMaxGradient(goldRarity);
                subMain.startColor = new ParticleSystem.MinMaxGradient(goldRarity);
                weaponName.color = goldRarity;
                break;
        }
    }

    private void SetStatIndicator(float newStat, float currentStat, Image img, bool lowerIsBetter = false)
    {
        img.sprite = newStat == currentStat ? line : arrow;

        if (newStat > currentStat || newStat < currentStat && lowerIsBetter)
        {
            SetImageFlipY(img, true);
            img.color = Color.green;
        }
        else if (newStat < currentStat || newStat > currentStat && lowerIsBetter)
        {
            SetImageFlipY(img, false);
            img.color = Color.red;
        }
        else
        {
            SetImageFlipY(img, false);
            img.color = Color.white;
        }
    }

    private void SetImageFlipY(Image img, bool flipY)
    {
        Vector3 scale = img.transform.localScale;
        scale.y = flipY ? -1 : 1;
        img.transform.localScale = scale;
    }

    private void Update()
    {
        Vector3 targetDirection = (transform.position - PlayerStats.Instance.GetCameraPosition()).normalized;
        targetDirection.y = 0;
        transform.rotation = Quaternion.LookRotation(targetDirection);
    }
}