using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;

namespace Gestor_de_Contenidos
{
    /*
     * Clase para visualizar los resultados de una historia social
     */
    public partial class frm_visualizar_hs : Form
    {
        private RegistroHS juego;               // Historia social completa
        RegistroNivelHS registro_nivel;        //Nivel que vemos por pantalla
        LinkedListNode<RegistroNivelHS> nodo; //Nodo de la Linked list que corresponde al nivel que estamos viendo por pantalla.
        
        private int aciertos = 0;
        private int fallos = 0;
        private int mano_derecha = 0;
        private int mano_izquierda = 0;
        private double duracion_total = 0;
        private int total_registros = 0;

        public frm_visualizar_hs(RegistroHS juego)
        {
            InitializeComponent();
            this.juego = juego;
            nodo = juego.registros.First;
            registro_nivel = nodo.Value;
            total_registros = juego.registros.Count;

        }

        private void frm_visualizar_mjs_Load(object sender, EventArgs e)
        {
            cargarListView();
            label1.Text = label1.Text + " " + juego.nombre_nivel + " jugado el " + juego.fecha_juego + " a las " +juego.hora_juego;
            label3.Text = label3.Text + " " + registro_nivel.nombre;
            cargarDatos();
            cargarCharts();
        }

        /*
         Método que carga las gráficas con los valores calculados anteriormente
         */
        private void cargarCharts()
        {

            chart1.Series.Clear();
            chart2.Series.Clear();

            chart1.ResetAutoValues();
            chart2.ResetAutoValues();

            string[] seriesArray = { "Aciertos", "Fallos"};
            int[] pointsArray = { aciertos,  fallos };
            for (int i = 0; i < seriesArray.Length; i++)
                {
                 // Aqui se agregan las series o Categorias.
                  Series series = this.chart1.Series.Add(seriesArray[i]);
                 // Aqui se agregan los Valores.
                  series.Points.Add(pointsArray[i]);
                   
                }

            chart1.BeginInit();

            string[] seriesArray2 = { "Mano Derecha", "Mano Izquierda" };
            int[] pointsArray2 = { mano_derecha, mano_izquierda };
            for (int i = 0; i < seriesArray2.Length; i++)
            {
                // Aqui se agregan las series o Categorias.
                Series series = this.chart2.Series.Add(seriesArray2[i]);
                // Aqui se agregan los Valores.
                series.Points.Add(pointsArray2[i]);
                
            }

            chart2.BeginInit();
        }

        /*
         Método que carga los datos que serán presentados, tanto en las gráficas como en texto
         */
        private void cargarDatos()
        {

            aciertos = fallos = mano_derecha = mano_izquierda = 0;
            duracion_total = 0;
            foreach (Registro reg in registro_nivel.registros) {

                if (reg.mano.Equals("Mano Derecha"))
                    mano_derecha++;
                else
                    mano_izquierda++;

                if (reg.tipo.Equals("fallo"))
                    fallos++;
                else
                    aciertos++;

                duracion_total = reg.tiempo;
                
            
            }
            label2.Text = label2.Text + " " + duracion_total / 1000 + " segundos"; 
        }

        /*
         Se carga el listview teniendo en cuenta de qué tipo es el nivel de la historia social que vamos a presentar
         */
        private void cargarListView()
        {
            lv_registros.Clear();

            //Columnas comunes a todos los tipos de niveles de HS
            lv_registros.Columns.Add("Tiempo",70);
            lv_registros.Columns.Add("Acierto-Fallo",100);
            lv_registros.Columns.Add("Mano", 120);

            if (registro_nivel.tipoNivel.Equals("Explicación"))
            {

                foreach (RegistroItemExplicacion reg in registro_nivel.registros)
                {
                    ListViewItem lvi = new ListViewItem(reg.tiempo.ToString());
                 
                    lvi.SubItems.Add(reg.tipo);
                    lvi.BackColor = Color.Green;

                    lvi.SubItems.Add(reg.mano);

                    lv_registros.Items.Add(lvi);


                }

            }
            if (registro_nivel.tipoNivel.Equals("Ordenación"))
            {
                lv_registros.Columns.Add("Item",100);
                foreach (RegistroItemOrden reg in registro_nivel.registros)
                {
                    ListViewItem lvi = new ListViewItem(reg.tiempo.ToString());
                    if (reg.tipo.Equals("acierto"))
                    {
                        lvi.SubItems.Add(reg.tipo);
                        lvi.BackColor = Color.Green;

                    }
                    else
                    {
                        lvi.SubItems.Add(reg.tipo);
                        lvi.BackColor = Color.Red;
                    }
                    lvi.SubItems.Add(reg.mano);
                    lvi.SubItems.Add(reg.item);
                    lv_registros.Items.Add(lvi);


                }
            }
            if (registro_nivel.tipoNivel.Equals("Clasificación"))
            {
                lv_registros.Columns.Add("Item", 100);
                lv_registros.Columns.Add("Clasificador", 100);
                foreach (RegistroItemClasificacion reg in registro_nivel.registros)
                {
                    ListViewItem lvi = new ListViewItem(reg.tiempo.ToString());
                    if (reg.tipo.Equals("acierto"))
                    {
                        lvi.SubItems.Add(reg.tipo);
                        lvi.BackColor = Color.Green;

                    }
                    else
                    {
                        lvi.SubItems.Add(reg.tipo);
                        lvi.BackColor = Color.Red;
                    }
                    lvi.SubItems.Add(reg.mano);
                    lvi.SubItems.Add(reg.item);
                    lvi.SubItems.Add(reg.clasificador);
                    lv_registros.Items.Add(lvi);


                }

            }
            if (registro_nivel.tipoNivel.Equals("Elección Única"))
            {
                lv_registros.Columns.Add("Elección", 100);
                foreach (RegistroItemEleccionUnica reg in registro_nivel.registros)
                {
                    ListViewItem lvi = new ListViewItem(reg.tiempo.ToString());
                    if (reg.tipo.Equals("acierto"))
                    {
                        lvi.SubItems.Add(reg.tipo);
                        lvi.BackColor = Color.Green;

                    }
                    else
                    {
                        lvi.SubItems.Add(reg.tipo);
                        lvi.BackColor = Color.Red;
                    }
                    lvi.SubItems.Add(reg.mano);
                    lvi.SubItems.Add(reg.eleccionSeleccionada);
                    lv_registros.Items.Add(lvi);


                }

            }
            if (registro_nivel.tipoNivel.Equals("Elección Libre"))
            {
                lv_registros.Columns.Add("Elección", 100);
                lv_registros.Columns.Add("Siguiente Nivel", 100);
                foreach (RegistroItemEleccionLibre reg in registro_nivel.registros)
                {
                    ListViewItem lvi = new ListViewItem(reg.tiempo.ToString());
                    if (reg.tipo.Equals("acierto"))
                    {
                        lvi.SubItems.Add(reg.tipo);
                        lvi.BackColor = Color.Green;

                    }
                    else
                    {
                        lvi.SubItems.Add(reg.tipo);
                        lvi.BackColor = Color.Red;
                    }
                    lvi.SubItems.Add(reg.mano);
                    lvi.SubItems.Add(reg.eleccionSeleccionada);
                    lvi.SubItems.Add(reg.siguienteNivel);
                    lv_registros.Items.Add(lvi);


                }

            }
            if (registro_nivel.tipoNivel.Equals("Colaboración"))
            {
                lv_registros.Columns.Add("Item", 100);
                foreach (RegistroItemColaboracion reg in registro_nivel.registros)
                {
                    ListViewItem lvi = new ListViewItem(reg.tiempo.ToString());
                    if (reg.tipo.Equals("acierto"))
                    {
                        lvi.SubItems.Add(reg.tipo);
                        lvi.BackColor = Color.Green;

                    }
                    else
                    {
                        lvi.SubItems.Add(reg.tipo);
                        lvi.BackColor = Color.Red;
                    }
                    lvi.SubItems.Add(reg.mano);
                    lvi.SubItems.Add(reg.item);
                    lv_registros.Items.Add(lvi);


                }

            }

           
        }

        private void btn_atras_Click(object sender, EventArgs e)
        {
            if (nodo.Previous != null) {

                nodo = nodo.Previous;
                registro_nivel = nodo.Value;

                cargarListView();
                
                label3.Text = "Nivel: " + registro_nivel.nombre;
                cargarDatos();
                cargarCharts();
                label2.Text = "Duración total " + duracion_total / 1000 + " segundos";
                chart1.EndInit();
                chart2.EndInit();
            }
        }

        private void btn_adelante_Click(object sender, EventArgs e)
        {
            if (nodo.Next != null)
            {

                nodo = nodo.Next;
                registro_nivel = nodo.Value;

                cargarListView();

                label3.Text = "Nivel: " + registro_nivel.nombre;
                cargarDatos();
                cargarCharts();
                label2.Text = "Duración total " + duracion_total / 1000 + " segundos";
                chart1.EndInit();
                chart2.EndInit();

            }
        }


    }
}
