using TMPro;
using UnityEngine;
using UnityEngine.U2D.Animation;
using UnityEngine.UI;

public class UIHeroSelection : MonoBehaviour
{
    [Header("References")]
    [SerializeField] private TextMeshProUGUI m_uiNameReference;
    [SerializeField] private TextMeshProUGUI m_uiDescriptionReference;
    [SerializeField] private GameObject m_heroPreviewReference;

    [Header("Hero Info")]
    [SerializeField] private string m_heroName;
    [TextArea]
    [SerializeField] private string m_description;

    [Header("USE ONE OF THESE / OR NONE")]
    [SerializeField] private Sprite m_heroSprite;         // Static preview
    [SerializeField] private SpriteLibraryAsset m_heroLibrary; // Animated preview

    [Header("Animation Settings (if using SpriteLibrary)")]
    public string m_category = "Idle";
    public string[] m_frames;     // label names inside the category
    public float m_frameRate = 6f;

    private int currentFrame;
    private float timer;
    private bool useAnimation;

    private Image m_uiImage;             // UI image to display sprite
    private SpriteResolver m_spriteResolver; // If using SpriteLibrary
    private SpriteLibrary m_spriteLibrary; // If using SpriteLibrary

    // ------------------------------------------------------
    void Start()
    {
        // Fill UI name + description
        if (m_uiNameReference != null)
            m_uiNameReference.text = m_heroName;

        if (m_uiDescriptionReference != null)
            m_uiDescriptionReference.text = m_description;

        if(m_heroPreviewReference != null)
        {
            m_spriteLibrary = m_heroPreviewReference.GetComponent<SpriteLibrary>();
            m_uiImage = m_heroPreviewReference.GetComponent<Image>();
            m_spriteResolver = m_heroPreviewReference.GetComponent<SpriteResolver>();
        }

        // Decide if we animate or just show static
        if (m_heroLibrary != null && m_spriteResolver != null && m_spriteLibrary!= null && m_frames.Length > 0)
        {
            useAnimation = true;

            // Instead of assigning directly to the readonly property, use the SpriteLibrary reference directly
            m_spriteResolver.ResolveSpriteToSpriteRenderer();
            m_spriteResolver.SetCategoryAndLabel(m_category, m_frames[0]);
            m_uiImage.sprite = m_heroLibrary.GetSprite(m_category, m_frames[0]);
        }
        else if (m_heroSprite != null && m_uiImage !=null)
        {
            useAnimation = false;
            m_uiImage.sprite = m_heroSprite;
        }
    }

    void Update()
    {
        if (!useAnimation) return;

        timer += Time.deltaTime;
        if (timer >= 1f / m_frameRate)
        {
            timer = 0f;
            currentFrame = (currentFrame + 1) % m_frames.Length;

            m_spriteResolver.SetCategoryAndLabel(m_category, m_frames[currentFrame]);
            m_uiImage.sprite = m_heroLibrary.GetSprite(m_category, m_frames[currentFrame]);
        }
    }
}

