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 Excel = Microsoft.Office.Interop.Excel;
using System.IO;

namespace OliviaAddIn
{
    public partial class DatosCsv : Form
    {
        Recogida reco = null;
        string id, lleno, csv, fecha, aux, auxi;
        string[] combo = new string[] { "No", "Si" };
        DateTime f_ini, f_fin;
        public static DateTime fe;
        int y, mo, d, h, mi, ind;
        public bool acept = false;


        ////////////////////////////////////////////////////        
        public DatosCsv(Recogida reco)
        {
            try
            {
                InitializeComponent();
                reinicia();
                comboBox_media.Items.AddRange(combo);
                dateTimePicker_fin.Enabled = false;
                this.reco = reco;

                textBox_id.Enabled = false;
                textBox_fecha.Enabled = false;
                textBox_llen.Enabled = false;
                comboBox_media.Enabled = false;
                dateTimePicker_ini.Enabled = false;
                dateTimePicker_fin.Enabled = false;
                button_reset.Enabled = false;
                btn_acept.Enabled = false;
            }
            catch (Exception)
            {
                MessageBox.Show("Error al iniciar la ventana de campos de CSV", "Olivia", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
        }


        private void reinicia()
        {
            id = RecogidaDef.campos.cons_id_csv;
            lleno = RecogidaDef.campos.cons_llen_csv;
            fecha = RecogidaDef.campos.cons_fecha_csv;

            ind = RecogidaDef.campos.cons_fechai_csv.IndexOf("/");
            auxi = RecogidaDef.campos.cons_fechai_csv.Substring(0, ind);
            d = Convert.ToInt32(auxi);
            aux = RecogidaDef.campos.cons_fechai_csv.Substring(ind + 1);
            ind = aux.IndexOf("/");
            auxi = aux.Substring(0, ind);
            mo = Convert.ToInt32(auxi);
            aux = aux.Substring(ind + 1);
            ind = aux.IndexOf(" ");
            auxi = aux.Substring(0, ind);
            y = Convert.ToInt32(auxi);
            aux = aux.Substring(ind + 1);
            ind = aux.IndexOf(":");
            auxi = aux.Substring(0, ind);
            h = Convert.ToInt32(auxi);
            aux = aux.Substring(ind + 1);
            mi = Convert.ToInt32(aux);

            RecogidaDef.campos.fechai_csv = new DateTime(y, mo, d, h, mi, 0);
            f_ini = RecogidaDef.campos.fechai_csv;

            ind = RecogidaDef.campos.cons_fechaf_csv.IndexOf("/");
            auxi = RecogidaDef.campos.cons_fechaf_csv.Substring(0, ind);
            d = Convert.ToInt32(auxi);
            aux = RecogidaDef.campos.cons_fechaf_csv.Substring(ind + 1);
            ind = aux.IndexOf("/");
            auxi = aux.Substring(0, ind);
            mo = Convert.ToInt32(auxi);
            aux = aux.Substring(ind + 1);
            ind = aux.IndexOf(" ");
            auxi = aux.Substring(0, ind);
            y = Convert.ToInt32(auxi);
            aux = aux.Substring(ind + 1);
            ind = aux.IndexOf(":");
            auxi = aux.Substring(0, ind);
            h = Convert.ToInt32(auxi);
            aux = aux.Substring(ind + 1);
            mi = Convert.ToInt32(aux);

            RecogidaDef.campos.fechaf_csv = new DateTime(y, mo, d, h, mi, 0);
            f_fin = RecogidaDef.campos.fechaf_csv;

            //se rellenan los datos en el dialogo
            textBox_id.Text = id;
            textBox_fecha.Text = fecha;
            textBox_llen.Text = lleno;

            dateTimePicker_ini.Value = f_ini;
            dateTimePicker_ini.MinDate = new DateTime(0001, 01, 01, 00, 00, 00);
            dateTimePicker_ini.MaxDate = new DateTime(2050, 01, 01, 00, 00, 00);

            dateTimePicker_fin.Value = f_fin;
            dateTimePicker_fin.MinDate = new DateTime(0001, 01, 01, 00, 00, 00);
            dateTimePicker_fin.MaxDate = new DateTime(2050, 01, 01, 00, 00, 00);
        }


        private void button_abrir_Click(object sender, EventArgs e)
        {
            try
            {
                System.Windows.Forms.OpenFileDialog openFileDialog1 = new System.Windows.Forms.OpenFileDialog();
                openFileDialog1.Filter = "CSV(*.csv)|*.csv";
                openFileDialog1.Title = "Abrir tabla de datos";

                // Show the Dialog.
                if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    csv = openFileDialog1.FileName;
                    textBox_id.Enabled = true;
                    textBox_fecha.Enabled = true;
                    textBox_llen.Enabled = true;
                    comboBox_media.Enabled = true;
                    dateTimePicker_ini.Enabled = true;
                    button_reset.Enabled = true;
                    btn_acept.Enabled = true;
                    lbl_csv.Text = System.IO.Path.GetFileName(openFileDialog1.FileName);
                    //dateTimePicker_fin.Enabled = true;
                }
                else
                {
                    textBox_id.Enabled = false;
                    textBox_fecha.Enabled = false;
                    textBox_llen.Enabled = false;
                    comboBox_media.Enabled = false;
                    dateTimePicker_ini.Enabled = false;
                    dateTimePicker_fin.Enabled = false;
                    button_reset.Enabled = false;
                    btn_acept.Enabled = false;
                    lbl_csv.Text = "Seleccionar CSV";
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Error al seleccionar el CSV", "Olivia", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
        }

        /*
        * Se validan los campos modificados y se guarda en memoria los nombres de los nuevos campos.
        * También se guardará en el archivo .INI una vez se vaya a ejecutar el proceso.
        */
        private void btn_acept_Click(object sender, EventArgs e)
        {
            List<string> title = new List<string>();
            List<string> time = new List<string>();
            List<string> lectura = new List<string>();
            List<string> num = new List<string>();
            string aux;
            int veces = 0, nveces = 0, ind, dia, mon, year, hor, min, col_id = -1, col_lleno = -1, col_fech = -1;
            double carg = 0;

            try
            {
                //se inicializan las listas doned se pondrán los iedntificadores y sus respectivas cargas que cumplan los requisitos de las fechas
                reco.id = new List<int>();
                reco.cargas = new List<double>();
                acept = true;

                //se recogen los datos introducidos en el dialogo
                RecogidaDef.campos.cons_id_csv = textBox_id.Text;
                reco.id_csv = RecogidaDef.campos.cons_id_csv;

                RecogidaDef.campos.cons_llen_csv = textBox_llen.Text;
                reco.llen_csv = RecogidaDef.campos.cons_llen_csv;

                RecogidaDef.campos.cons_fecha_csv = textBox_fecha.Text;
                reco.fecha_csv = RecogidaDef.campos.cons_fecha_csv;

                f_ini = dateTimePicker_ini.Value;
                if (dateTimePicker_fin.Enabled == true)
                    f_fin = dateTimePicker_fin.Value;

                RecogidaDef.campos.fechai_csv = f_ini;
                if (comboBox_media.SelectedIndex == 1)
                    RecogidaDef.campos.fechaf_csv = f_fin;
                else if (comboBox_media.SelectedIndex == 0)
                    RecogidaDef.campos.fechaf_csv = new DateTime(2049, 01, 01, 00, 01, 00);
                else
                {
                    MessageBox.Show("Hay que seleccionar si se requiere hacer la media de fechas", "Olivia", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return;
                }
                if (RecogidaDef.campos.fechai_csv > RecogidaDef.campos.fechaf_csv)
                {
                    MessageBox.Show("La fecha final no puede ser menor que la fecha inicial", "Olivia", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
                RecogidaDef.campos.cons_fechai_csv = RecogidaDef.campos.fechai_csv.ToString("dd/MM/yyyy") + " " + RecogidaDef.campos.fechai_csv.ToString("H:mm");
                reco.fechai_csv = RecogidaDef.campos.cons_fechai_csv;
                RecogidaDef.campos.cons_fechaf_csv = RecogidaDef.campos.fechaf_csv.ToString("dd/MM/yyyy") + "  " + RecogidaDef.campos.fechaf_csv.ToString("H:mm");
                reco.fechaf_csv = RecogidaDef.campos.cons_fechaf_csv;


                using (var reader = new StreamReader(csv, Encoding.Default))
                {
                    Encoding enc = reader.CurrentEncoding;
                    while (!reader.EndOfStream)
                    {
                        veces++;
                        var line = reader.ReadLine();
                        var values = line.Split(';');
                        if (veces == 1)
                        {
                            title.AddRange(values);
                            for (int i = 0; i < title.Count; i++)
                            {
                                if (title[i] == reco.id_csv)
                                    col_id = i;
                                else if (title[i] == reco.fecha_csv)
                                    col_fech = i;
                                else if (title[i] == reco.llen_csv)
                                    col_lleno = i;
                            }
                            if (col_id == -1)
                            {
                                MessageBox.Show(string.Format("El nombre del campo {0} para los indetificadores no es correcto", reco.id_csv), "Olivia", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                return;
                            }
                            if (col_fech == -1)
                            {
                                MessageBox.Show(string.Format("El nombre del campo {0} para las fechas no es correcto", reco.fecha_csv), "Olivia", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                return;
                            }
                            if (col_lleno == -1)
                            {
                                MessageBox.Show(string.Format("El nombre del campo {0} para los porcentajes de llenado no es correcto", reco.llen_csv), "Olivia", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                return;
                            }
                            continue;
                        }

                        time.Add(values[col_fech]);
                        lectura.Add(values[col_lleno]);
                        num.Add(values[col_id]);
                    }
                }
                if (dateTimePicker_fin.Enabled == true)
                {
                    for (int i = 0; i < time.Count; i++)
                    {
                        ind = time[i].IndexOf("/");
                        dia = Convert.ToInt32(time[i].Substring(0, ind));
                        aux = time[i].Substring(ind + 1);
                        ind = aux.IndexOf("/");
                        mon = Convert.ToInt32(aux.Substring(0, ind));
                        aux = aux.Substring(ind + 1);
                        ind = aux.IndexOf(" ");
                        year = Convert.ToInt32(aux.Substring(0, ind));
                        aux = aux.Substring(ind + 1);
                        ind = aux.IndexOf(":");
                        hor = Convert.ToInt32(aux.Substring(0, ind));
                        min = Convert.ToInt32(aux.Substring(ind + 1));

                        fe = new DateTime(year, mon, dia, hor, min, 0);

                        if ((fe >= f_ini) && (fe <= f_fin))
                        {
                            nveces++;
                            if (lectura[i] == "")
                                lectura[i] = "100";
                            carg = carg + Convert.ToDouble(lectura[i], System.Globalization.CultureInfo.InvariantCulture);
                        }
                        if ((i == time.Count - 1) || (num[i] != num[i + 1]))
                        {
                            reco.id.Add(Convert.ToInt32(num[i]));
                            reco.cargas.Add(carg / nveces);
                            nveces = 0;
                            carg = 0;
                        }
                    }
                }
                else
                {
                    for (int i = 0; i < time.Count; i++)
                    {
                        if (time[i] == reco.fechai_csv)
                        {
                            reco.id.Add(Convert.ToInt32(num[i]));
                            if (lectura[i] == "")
                                lectura[i] = "100";

                            reco.cargas.Add(Convert.ToDouble(lectura[i], System.Globalization.CultureInfo.InvariantCulture));
                            continue;
                        }
                    }
                }
                Close();
            }
            catch (Exception)
            {
                MessageBox.Show("Error al validar los datos introducidos en la ventana", "Olivia", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void comboBox_media_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (comboBox_media.SelectedIndex == 1)
                dateTimePicker_fin.Enabled = true;
            else if (comboBox_media.SelectedIndex == 0)
                dateTimePicker_fin.Enabled = false;
            else
                MessageBox.Show("Hay que seleccionar si se requiere hacer la media de fechas", "Olivia", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void DatosCsv_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (acept == false)
            {
                reco.id_csv = null;
                reco.llen_csv = null;
                reco.fecha_csv = null;
                reco.fechai_csv = null;
                reco.fechaf_csv = null;
                reco.id = null;
                reco.cargas = null;
            }
        }

        private void button_reset_Click(object sender, EventArgs e)
        {
            try
            {
                reinicia();
            }
            catch (Exception)
            {
                MessageBox.Show("Error al resetear", "Olivia", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
    }
}
