using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Video;

namespace BABA
{
    public class MainScript : MonoBehaviour
    {
        public int timerCompteurVeille;
        public Transform boutons;
        private List<Button> allButtons = new List<Button>();

        #region Videoplayer
        public VideoPlayer video_player;
        //public VideoPlayer video_player_loop;
        #endregion

        #region Slides
        public Slide[] slides;
        #endregion

        #region Fonctions
        private void Start()
        {
            //On démarre sur le premier slide de la liste
            HandleClickFunction(slides[0]);
        }
        public void HandleClickFunction(Slide slide)
        {
            // Récupère tous les boutons enfants du Canvas
            allButtons.AddRange(boutons.GetComponentsInChildren<Button>());

            //Desactivation de tous les compteurs
            StopAllCoroutines();

            //Stop des videoplayer
            video_player.Stop();
            //video_player_loop.Stop();

            //Si il faut reinitiliser le compteur de veille
            if (slide.initVeille)
            {
                //réinitialisation compteur veille
                StopCoroutine("activation_compteur_veille");
                StartCoroutine("activation_compteur_veille", timerCompteurVeille);
            }

            //Si on doit desactiver la veille sur le slide
            if (slide.StopCompteurVeille)
            {
                StopCoroutine("activation_compteur_veille");
            }

            //Si le slide est pas en loop
            if (!slide.isLoop)
            {
                video_player.isLooping = false;
                video_player.clip = slide.videoClip;
                video_player.Play();

                //Si il faut activer un slider apres le slide 
                if (slide.isSliderAfterSlide)
                {
                    double duration = video_player.length;
                    float timer = (float)duration;
                    StartCoroutine(activation_slider_suivant(timer, slide.SliderAfterSlide));
                }

                //Si il faut executer une fonction apres le slide
                if (slide.ExecuteFunctionAfterTimer)
                {
                    slide.ScriptToExecute.SetActive(true);
                }

                //Si il faut activer une loop apres le clip d'intro
                if (slide.isLoopAfterVideo)
                {
                    double duration = video_player.length;
                    float timer = (float)duration;
                    StartCoroutine(activation_compteur_video_loop(timer, slide.videoAfterLoop));
                }
            }
            else
            {
                video_player.isLooping = true;
                video_player.clip = slide.videoClip;
                video_player.Play();
            }

            if (slide.TimerBOUTONS)
            {
                StartCoroutine(activation_bouton_delayed(1, slide));
            }
            else
            {
                //Activation des boutons sur le slide
                //pour tous les boutons présent dans la définition du slide -> on les active
                foreach (Button button in allButtons)
                {
                    CanvasGroup buttonCanvasGroup = button.GetComponent<CanvasGroup>();
                    if (buttonCanvasGroup == null)
                    {
                        buttonCanvasGroup = button.gameObject.AddComponent<CanvasGroup>();
                    }

                    if (slide.buttonsToActivate.Contains(button.name))
                    {
                        button.gameObject.SetActive(true);
                    }
                    else
                    {
                        button.gameObject.SetActive(false);
                    }
                }
            }

        }


        private void ActivationSliderSuivant(Slide slidersuivant)
        {
            HandleClickFunction(slidersuivant);
        }
        #endregion

        #region Compteurs
        IEnumerator activation_compteur_video_loop(float timer, VideoClip videoclipAfterTimer)
        {
            while (true)
            {
                yield return new WaitForSeconds(timer);
                video_player.isLooping = true;
                video_player.clip = videoclipAfterTimer;
                video_player.Play();
                break;
            }
        }

        private IEnumerator activation_compteur_veille(int timer)
        {
            while (true)
            {
                yield return new WaitForSeconds(timer);
                Start();
                break;

            }
        }

        IEnumerator activation_slider_suivant(float timer, Slide slidersuivant)
        {
            while (true)
            {
                yield return new WaitForSeconds(timer);
                ActivationSliderSuivant(slidersuivant);
                break;

            }
        }

        private IEnumerator activation_bouton_delayed(int timer, Slide slide)
        {
            while (true)
            {
                yield return new WaitForSeconds(timer);
                foreach (Button button in allButtons)
                {
                    CanvasGroup buttonCanvasGroup = button.GetComponent<CanvasGroup>();
                    if (buttonCanvasGroup == null)
                    {
                        buttonCanvasGroup = button.gameObject.AddComponent<CanvasGroup>();
                    }

                    if (slide.buttonsToActivate.Contains(button.name))
                    {
                        button.gameObject.SetActive(true);
                    }
                    else
                    {
                        button.gameObject.SetActive(false);
                    }
                }
                break;

            }
        }
        #endregion

    }
}

