using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TMPro;
using UnityEngine.Events;

namespace SimplifyXR
{
    [System.Serializable]
    public class ImagePanelContent
    {
        public Sprite image;
        public string imageName;
        public string imageDescription;
    }


    public class ImagePanelFeatures : BasePanelFeatures
    {

        [HideInInspector]
        public List<ImagePanelContent> images;
        int currentImage;


        [Header("Image Panel Features")]

        public bool customizeImagePanelFeatures;

        [Conditional("customizeImagePanelFeatures", true, ComparisonType.Equals), 
            Tooltip("Toggle the default behavior for the next button.")]
        public bool autoNextImageButton = true;
        [Conditional("customizeImagePanelFeatures", true, ComparisonType.Equals),
            Tooltip("Toggle the default behavior for the back button.")]
        public bool autoBackImageButton = true;
        [Conditional("customizeImagePanelFeatures", true, ComparisonType.Equals),
            Tooltip("Auto populate the image counter text.")]
        public bool autoImageCounterText = true;
        [Conditional("customizeImagePanelFeatures", true, ComparisonType.Equals),
            Tooltip("Automatically set the image content from Directives.")]
        public bool autoSetImageContent = true;
        [Conditional("customizeImagePanelFeatures", true, ComparisonType.Equals),
            Tooltip("Automatically set the title text from Directives.")]
        public bool autoImageTitleText = true;


        TextMeshProUGUI imageText => baseRoot.GetElementAsType<TextMeshProUGUI>("Image Text");
        Button nextButton => baseRoot.GetElementAsType<Button>("Next Button");
        Button previousButton => baseRoot.GetElementAsType<Button>("Back Button");
        Image imageContent => baseRoot.GetElementAsType<Image>("Image Content");

        [HideInInspector]
        public UnityEvent<ImagePanelContent> OnImageChanged =
            new UnityEvent<ImagePanelContent>();

        public void GoToNextImage()
        {
            if (currentImage != images.Count - 1) currentImage++;
            UpdateContent();
        }

        public void GoToPreviousImage()
        {
            if (currentImage > 0) currentImage--;
            UpdateContent();
        }


        public void SetImages(List<ImagePanelContent> images)
        {
            this.images = images;
            currentImage = 0;
            UpdateContent();
        }

        private void UpdateContent()
        {
            if(autoSetImageContent) UpdateImageAtID(currentImage);
            UpdateImagesText(currentImage);
            nextButton.interactable = currentImage < images.Count - 1;
            previousButton.interactable = currentImage > 0;
            OnImageChanged?.Invoke(images[currentImage]);
        }

        private void UpdateImageAtID(int id)
        {
            imageContent.gameObject.SetActive(false);
            imageContent.gameObject.SetActive(true);
            imageContent.sprite = images[id].image;
        }

        private void UpdateImagesText(int id)
        {
            if (autoImageCounterText)  imageText.text = (id + 1).ToString() + " of " + images.Count;
            if (autoImageTitleText) titleText.text = images[id].imageName;
        }


        public new void Awake()
        {
            base.Awake();
            if (autoNextImageButton) nextButton.onClick.AddListener(GoToNextImage);
            if (autoBackImageButton) previousButton.onClick.AddListener(GoToPreviousImage);
        }

        public new void OnDestroy()
        {
            base.OnDestroy();
            nextButton.onClick.RemoveAllListeners();
            previousButton.onClick.RemoveAllListeners();
        }

    }

}

