using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Guion : MonoBehaviour {

    public static Guion instancia;
    public Collider2D[] colisionadores;
    public Dictionary<string, System.Action> acciones;
    public Consola consola;

    public int incidentes = 0;
    public bool[] llegoADestinos;
    public bool llegoAIshtar;
    public TextoEnEscena texto;
    public GameObject tormenta1;
    public GameObject tormenta2;

    public void Awake()
    {
        instancia = this;

        llegoADestinos = new bool[3];

        acciones = new Dictionary<string, System.Action>();
        acciones.Add("PrimerIncidente", PrimerIncidente);
        acciones.Add("SegundoIncidente", SegundoIncidente);
        acciones.Add("Fourier", () => LlegaADestino(0));
        acciones.Add("Tesla", () => LlegaADestino(1));
        acciones.Add("Clausius", () => LlegaADestino(2));
        acciones.Add("Ishtar", LlegaAIshtar);
    }

    private void Start()
    {
        AbrirDialogo(0,
            () => EsperarY(3f,
              () => AbrirDialogo(1,
                        () => EsperarY(1f,
                                        IniciarCruceroAFourier
                                      )
                                )
                          )
            );
    }

    /*
        (inicio del juego)
        
        
        (3s)
        Err… gma a… tar. Errante Si… … r. Solic … os ayud … ompletar la misi… y volve… a base.
        (mostrar controles de teclas y radar y activar componente InputTeclas)

        Almirante, hay más problemas en la transmisión. Sólo podemos usar mensajes binarios para que les lleguen nuestras instrucciones. Mantenga apretado para los unos, suéltelo para los ceros. Dejé una copia de los comandos en su pantalla.

    */

    private void AbrirDialogo(int indice, System.Action callback = null)
    {
        Debug.Log(indice);
        texto.CambiaTexto(indice, callback);
        ///Abrir texto en escena con índice indicado y con la callback.
        //if (callback != null)
            //EsperarY(1, callback);
    }

    public void EntraEnColision(Collider2D col)
    {
        System.Action accion;
        if (acciones.TryGetValue(col.name, out accion))
            accion();
    }

    private void IniciarCruceroAFourier()
    {
        ControlNave.instancia.Enfilar(new Vector3(-6.5f, -0.67f, 0));
        EsperarY(3, ControlNave.instancia.IniciarVelocidadCrucero);
    }

    private void DetenerNave()
    {
        ControlNave.instancia.Detener();
    }

    public void PrimerIncidente()
    {
        if(incidentes == 0)
        {
            Debug.Log("Primer incidente");

            ControlNave.instancia.indiceVelocidadActual = 1;
            MostrarPrimeraTormenta();

            AbrirDialogo(2,
                () => EsperarY(1,
                    () => AbrirDialogo(3, () => EsperarY(5, TerminarPrimerIncidente)))
            );

            incidentes = 1;
        }
    }

    private void MostrarPrimeraTormenta()
    {
        tormenta1.transform.position = ControlNave.instancia.transform.position;
        tormenta1.gameObject.SetActive(true);
    }

    private void TerminarPrimerIncidente()
    {
        //OcultarPrimeraTormenta();
        DetenerNave();
        tormenta1.gameObject.SetActive(false);

        AbrirDialogo(4,
            () => EsperarY(1,
            () => AbrirDialogo(5,
            () => EsperarY(2,
            () => AbrirDialogo(6,
            () => EsperarY(1,
            () => AbrirDialogo(7,
            () => EsperarY(.5f,
            () => AbrirDialogo(8,
            () => EsperarY(2,
            () =>
            {
                consola.IniciarModoTeclas();
                EsperarY(1, () => AbrirDialogo(10));
            })
        )))))))));
    }

    public void SegundoIncidente()
    {
        if (incidentes == 1)
        {
            tormenta2.transform.position = ControlNave.instancia.transform.position;
            tormenta2.gameObject.SetActive(true);

            consola.DesactivarModos();
            Debug.Log("Segundo incidente");
            incidentes = 2;
            DetenerNave();

            AbrirDialogo(11,
                () => EsperarY(2,
                () =>
                {
                    DetenerNave();
                    consola.IniciarModoBinario();
                    tormenta2.gameObject.SetActive(false);
                    EsperarY(1,
                        () =>
                            AbrirDialogo(12)
                        );
                }
            ));
        }
    }

    public void LlegaADestino(int indice)
    {
        if(!llegoADestinos[indice])
        {
            Debug.Log("llega a destino " + indice);
            DetenerNave();
            llegoADestinos[indice] = true;

            var mensajesPorPlaneta = new int[] { 14, 15, 16 };
            AbrirDialogo(mensajesPorPlaneta[indice],
                () => AbrirDialogo(todosLosPlanetasFueronVisitados ? 18 : 17));
        }
    }

    public bool todosLosPlanetasFueronVisitados
    {
        get { return llegoADestinos[0] && llegoADestinos[1] && llegoADestinos[2]; }
    }

    public void LlegaAIshtar()
    {
        if (todosLosPlanetasFueronVisitados && !llegoAIshtar)
        {
            consola.DesactivarModos();
            DetenerNave();
            llegoAIshtar = true;
            AbrirDialogo(13);
        }
    }

    private void EsperarY(float tiempo, System.Action accionPosterior)
    {
        StartCoroutine(Esperar(tiempo, accionPosterior));
    }

    private IEnumerator Esperar(float tiempo, System.Action accionPosterior)
    {
        yield return new WaitForSeconds(tiempo);
        accionPosterior();
    }
}
