namespace Scripts.Routes
{
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using Scripts.Waypoints;
    using Scripts.IA;

    //! @authors MrWarzo
    //!     Wakestufou
    //! @brief Trace la route entre le départ et l'arrivée.
    //! @details Récupère tout les points formants un chemin entre le départ et l'arrivée et crée une ligne visible en jeu pour le représenter.
    public class RouteTracer : MonoBehaviour
    {
        // Champs publiques
        public Material mat; //!< Matériaux de la ligne.
        public Transform linesParent; //!< @b GameObject contenant tout les morceaux de ligne.

        // Champs privés
        private List<Transform> _waypoints; //!< Liste de tout les waypoints par lesquels la ligne doit passer.
        [SerializeField] Transform _startObject; //!< @b GameObject de début de la ligne. 
        [SerializeField] Transform _finishObject; //!< @b GameObject de fin de la ligne.

        //! @brief Se lance au lancement du script.
        //! @details Initialise une coroutine sur @b CreateLine().
        private void Start()
        {
            StartCoroutine(CreateLine());
        }

        //! @brief Création d'une ligne entre deux @b GameObject
        //! @details Récupère les waypoints de départ et d'arrivée et utilise le script @b Waypoints.WaypointsFactory afin de récupérer la liste des points suivant les routes réelles.
        //!     Lance ensuite la fonction @b DrawLine(Vector3, Vector3, Color, float) avec en paramètre des couples de cette liste de manière à tracer une ligne complète suivant les étapes entre le départ et l'arrivée.
        //!     Une fois la ligne entière terminée, active la @b IA.RunnersFactory puis arrête la coroutine.
        //! @return @eIEnumerator Permet d'assigner un délai à la répétition de la coroutine.
        IEnumerator CreateLine()
        {
            yield return new WaitUntil(() => WaypointsFactory.getInstance().getTest() == false);
            Debug.Log(WaypointsFactory.getInstance().getTest());
            _waypoints = WaypointsFactory.getInstance().getWp();

            _startObject = GameObject.FindGameObjectWithTag("start_wp").transform;
            _finishObject = GameObject.FindGameObjectWithTag("end_wp").transform;

            for (int i = 0; i < _waypoints.Count - 1; i++)
            {
                if (i == 0)
                {
                    _startObject = GameObject.FindGameObjectWithTag("start_wp").transform;
                    _finishObject = _waypoints[i + 1];
                }
                else if (i == _waypoints.Count - 2)
                {
                    _startObject = _waypoints[i];
                    _finishObject = GameObject.FindGameObjectWithTag("end_wp").transform;
                }
                else
                {
                    _startObject = _waypoints[i];
                    _finishObject = _waypoints[i + 1];
                }

                DrawLine(_startObject.transform.position, _finishObject.transform.position, Color.cyan, 1f);
            }

            while(Ui.start == false)
            {

            }

                GameObject.Find("Player").transform.position =
                new Vector3(
                     (float)((GameObject.FindGameObjectWithTag("start_wp").transform.position.x + GameObject.FindGameObjectWithTag("end_wp").transform.position.x) / 2d),
                     GameObject.Find("Player").transform.position.y,
                     (float)((GameObject.FindGameObjectWithTag("start_wp").transform.position.z + GameObject.FindGameObjectWithTag("end_wp").transform.position.z) / 2d)
                    );



                GameObject.Find("Sportifs").GetComponent<RunnersFactory>().enabled = true;

            
            
        }

        //! @param start Position du @b GameObject de départ.
        //! @param end Position du @b GameObject d'arrivée.
        //! @param color Couleur de la ligne.
        //! @param width Largeur de la ligne.
        //! @brief Crée une ligne entre deux @b GameObject.
        //! @details Crée un @b GameObject, lui assigne un  @b LineRenderer et initialise celui-ci pour rejoindre les objets @a start et @a end afin de former une ligne.
        void DrawLine(Vector3 start, Vector3 end, Color color, float width)
        {
            GameObject myLine = new GameObject();
            myLine.transform.position = start;
            myLine.AddComponent<LineRenderer>();
            myLine.transform.parent = linesParent;
            LineRenderer lr = myLine.GetComponent<LineRenderer>();
            lr.material = mat;
            lr.startColor = color;
            lr.endColor = color;
            lr.startWidth = width;
            lr.endWidth = width;
            lr.SetPosition(0, start);
            lr.SetPosition(1, end);
        }
    }
}