using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
using System;
using NaughtyAttributes;

class UpgradeManager : MonoBehaviour
{
    public static UpgradeManager Instance;

    [BoxGroup("EnergySystem Upgrades")]
    [SerializeField] private Upgrade fastRechargeUpgrade;

    [SerializeField] Upgrade[] _upgrades;
    [System.NonSerialized] public List<Upgrade> UsableUpgrades = new List<Upgrade>();

    private PlayerSaveData saveData => GameManager.Instance.SaveData;
    private void Awake()
    {
        Instance = this;
    }

    public Upgrade GetByName(string name)
    {
        Upgrade upgrade = Array.Find(_upgrades, u => u.name == name);
        if (upgrade == null)
        {
            throw new ArgumentException($"Unknown upgrade: {name}", nameof(name));
        }
        return upgrade;
    }

    public void GenerateUsableUpgrades()
    {
        UsableUpgrades.Clear();
        foreach (Upgrade upgrade in _upgrades)
        {
            bool hasUnmetDependancies = false;
            foreach (Upgrade dependance in upgrade.Dependancies)
            {
                if (!saveData.HasUpgrade(dependance))
                {
                    hasUnmetDependancies = true;
                    break;
                }
            }

            if (saveData.HasMaximumUpgrade(upgrade)) { continue; }

            //Debug.Log($"{upgrade.name} is missing dependendies? {hasUnmetDependancies}");
            if (!hasUnmetDependancies) UsableUpgrades.Add(upgrade);
        }

        if (GameManager.Instance.UseEnergySystem)
        {
            UsableUpgrades.Add(fastRechargeUpgrade);
        }
    }

    public Upgrade GetRandom()
    {
        int randUpgrade = UnityEngine.Random.Range(0, UsableUpgrades.Count);
        return UsableUpgrades[randUpgrade];
    }
}