using compabetov2.database;
using compabetov2.database.modelos;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace compabetov2
{
    public partial class Estadiscticas : Form
    {
        Dictionary<string, List<Dictionary<string, dynamic>>> resumen;
        public Estadiscticas()
        {
            InitializeComponent();
            darFormatoDTP();
        }

        private void darFormatoDTP()
        {
            dtpBuscar.Format = DateTimePickerFormat.Custom;
            dtpBuscar.CustomFormat = "dd/MM/yyyy";
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            string fechaBuscaStr = dtpBuscar.Text;

            DateTime.TryParseExact(fechaBuscaStr, "dd/MM/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime fechaBuscar);
            resumen = service.estadisticas(fechaBuscar);
            List<DetalleVentaModel> productosMes = estadisticasMes();
            List<DetalleVentaModel> productosDia = estadisticasDia();
            decimal totalmes = totalMes();
            decimal totaldia = totalDia();
            Dictionary<string, List<Envio>> envios = service.conseguirEnvioMes(fechaBuscar);

            Dictionary<string,dynamic> estadisticas = new Dictionary<string, dynamic>
            {
                { "mes", new Dictionary<string, dynamic>{
                        { "productos", productosMes },
                        { "productoMasVendido", prodctoMasVendido(productosMes) },
                        { "mejorVendedor", mejorVenderdorMes() },
                        { "totalMes", totalmes },
                        { "EnvioCantidad", totalMesSinEnvio(envios) },
                    }
                },
                { "dia", new Dictionary<string, dynamic>{
                        { "productos", productosDia },
                        { "productoMasVendido", prodctoMasVendido(productosDia) },
                        { "mejorVendedor", mejorVenderdorDia() },
                        { "totalDia", totalDia()},
                        { "EnvioCantidad", totalDiaSinEnvio(envios) },
                    } 
                }
            };
            mostrarDatos(estadisticas);
        }

        private int totalMesSinEnvio(Dictionary<string, List<Envio>> envios)
        {

            return envios["mes"].Count;
        }

        private int totalDiaSinEnvio(Dictionary<string, List<Envio>> envios)
        {
            return envios["dia"].Count;
        }

        private decimal totalMes()
        {
            List<Dictionary<string, dynamic>> mes = resumen["mes"];

            return calcularTotal(mes);
        }

        private decimal totalDia()
        {
            List<Dictionary<string, dynamic>> dia = resumen["dia"];

            return calcularTotal(dia);
        }

        private decimal calcularTotal(List<Dictionary<string, dynamic>> resumen)
        {
            decimal total = 0;
            foreach (Dictionary<string, dynamic> venta_y_detalles in resumen)
            {
                VentaModel venta = venta_y_detalles["venta"];

                total += venta.total;
            }

            return total;
        }

        private List<DetalleVentaModel> estadisticasDia()
        {
            //solo copie y pegue le metodo estadisticas dia y cambie el key en resumen de mes a dia
            List<Dictionary<string, dynamic>> mes = resumen["dia"];

            List<DetalleVentaModel> detallesMes = new List<DetalleVentaModel>();
            foreach (Dictionary<string, dynamic> venta_y_detalles in mes)
            {
                foreach (DetalleVentaModel detallesVenta in venta_y_detalles["detalles"])
                {
                    int totalElementos = detallesMes.Count;
                    int contador = 0;
                    for (int i = 0; i <= totalElementos; i++)
                    {
                        contador++;
                        if (i == totalElementos)
                        {
                            DetalleVentaModel detalleAgregar = new DetalleVentaModel(detallesVenta.cantidad, detallesVenta.producto, detallesVenta.idVenta);
                            detallesMes.Add(detalleAgregar);
                            break;
                        }

                        DetalleVentaModel producto = detallesMes[i];

                        if (producto.producto.nombre.Equals(detallesVenta.producto.nombre))
                        {
                            producto.cantidad += detallesVenta.cantidad;
                            break;
                        }

                        //si no existe el producto lo agrega

                    }

                    if (contador == 0)
                    {
                        detallesMes.Add(detallesVenta);
                    }

                }
            }
            return detallesMes;
        }

        private void mostrarDatos(Dictionary<string, dynamic> estadisticas)
        {
            dgvDia.Rows.Clear();
            dgvMes.Rows.Clear();
            List<DetalleVentaModel> detallesMes = estadisticas["mes"]["productos"];
            decimal totalVendidoMes = 0;
            foreach (DetalleVentaModel producto in detallesMes)
            {
                totalVendidoMes += (producto.cantidad * producto.producto.cantidad) * producto.producto.precio;
                // Crear una nueva fila
                DataGridViewRow nuevaFila = new DataGridViewRow();

                // Crear celdas para la nueva fila
                DataGridViewCell productoN = new DataGridViewTextBoxCell();
                DataGridViewCell precio = new DataGridViewTextBoxCell();
                DataGridViewCell cantidad = new DataGridViewTextBoxCell();
                DataGridViewCell total = new DataGridViewTextBoxCell();

                // Establecer los valores de las celdas (puedes ajustar según tu necesidad)
                productoN.Value = $"{producto.producto.nombre}";
                precio.Value = $"{producto.producto.precio}";
                cantidad.Value = $"{producto.cantidad}";
                total.Value = $"{producto.cantidad * producto.producto.precio}";
                
                // Agregar las celdas a la fila
                nuevaFila.Cells.Add(productoN);
                nuevaFila.Cells.Add(precio);
                nuevaFila.Cells.Add(cantidad);
                nuevaFila.Cells.Add(total);

                // Agregar la nueva fila al DataGridView
                dgvMes.Rows.Add(nuevaFila);
            }
            decimal totalSinEnvioMes = estadisticas["mes"]["totalMes"] - (estadisticas["mes"]["EnvioCantidad"] *10);
            lbTotalMes.Text = $"Total de mes: ${estadisticas["mes"]["totalMes"]}";
            lbProductoMes.Text  = $"Producto mas vendido: {estadisticas["mes"]["productoMasVendido"]}";
            lbVendedorMes.Text = $"Mejor vendedor: {estadisticas["mes"]["mejorVendedor"]}";
            lbMesSEnvio.Text = $"Total del mes sin envios: ${totalSinEnvioMes}";

            //dia
            List<DetalleVentaModel> detallesDia = estadisticas["dia"]["productos"];
            decimal totalVendidoDia = 0;
            foreach (DetalleVentaModel producto in detallesDia)
            {
                totalVendidoDia += (producto.cantidad * producto.producto.cantidad) * producto.producto.precio;
                // Crear una nueva fila
                DataGridViewRow nuevaFila = new DataGridViewRow();

                // Crear celdas para la nueva fila
                DataGridViewCell productoN = new DataGridViewTextBoxCell();
                DataGridViewCell precio = new DataGridViewTextBoxCell();
                DataGridViewCell cantidad = new DataGridViewTextBoxCell();
                DataGridViewCell total = new DataGridViewTextBoxCell();

                // Establecer los valores de las celdas (puedes ajustar según tu necesidad)
                productoN.Value = $"{producto.producto.nombre}";
                precio.Value = $"{producto.producto.precio}";
                cantidad.Value = $"{producto.cantidad}";
                total.Value = $"{producto.cantidad * producto.producto.precio}";

                // Agregar las celdas a la fila
                nuevaFila.Cells.Add(productoN);
                nuevaFila.Cells.Add(precio);
                nuevaFila.Cells.Add(cantidad);
                nuevaFila.Cells.Add(total);

                // Agregar la nueva fila al DataGridView
                dgvDia.Rows.Add(nuevaFila);
            }

            decimal totalSinEnvioDia = estadisticas["dia"]["totalDia"] - (estadisticas["dia"]["EnvioCantidad"] * 10);
            lbTotalDia.Text = $"Total de dia: ${estadisticas["dia"]["totalDia"]}";
            lbProductDia.Text = $"Producto mas vendido: {estadisticas["dia"]["productoMasVendido"]}";
            lbVendedorDia.Text = $"Mejor vendedor: {estadisticas["dia"]["mejorVendedor"]}";
            lbDiaSEnvio.Text = $"Total del dia sin envios: ${totalSinEnvioDia}";
        }

        private List<DetalleVentaModel> estadisticasMes()
        {
            List<Dictionary<string, dynamic>> mes = resumen["mes"];

            List <DetalleVentaModel> detallesMes = new List<DetalleVentaModel>();
            foreach (Dictionary<string, dynamic> venta_y_detalles in mes)
            {
                foreach (DetalleVentaModel detallesVenta in venta_y_detalles["detalles"])
                {
                    int totalElementos = detallesMes.Count;
                    int contador = 0;
                    for(int i = 0; i <= totalElementos; i++) {
                        contador++;
                        //si no encuentra el producto lo agrega
                        if (i == totalElementos)
                        {
                            DetalleVentaModel detalleAgregar = new DetalleVentaModel(detallesVenta.cantidad, detallesVenta.producto, detallesVenta.idVenta);
                            detallesMes.Add(detalleAgregar);
                            break;
                        }

                        DetalleVentaModel producto = detallesMes[i];
                        //si encuentra el produco solo aumneta la cantidad
                        if (producto.producto.nombre.Equals(detallesVenta.producto.nombre))
                        {
                            producto.cantidad += detallesVenta.cantidad;
                            break;
                        }

                        //si no existe el producto lo agrega

                    }

                    if(contador == 0)
                    {
                        detallesMes.Add(detallesVenta);
                    }
                    
                }
            }
            return detallesMes;
        }

        private string mejorVenderdorMes()
        {
            List<Dictionary<string, dynamic>> mes = resumen["mes"];
            string mejorVendedor = "";
            int contadorNumeroVentas = 0;

            Dictionary<string,int> empleados = new Dictionary<string,int>();
            foreach(Dictionary<string, dynamic> venta_y_detalle in mes)
            {
                VentaModel venta = venta_y_detalle["venta"];

                if (empleados.ContainsKey(venta.responzable))
                {
                    empleados[venta.responzable] += 1;
                }
                else
                {
                    empleados.Add(venta.responzable, 1);
                }
            }

            foreach(string empleado in empleados.Keys)
            {
                if (empleados[empleado] > contadorNumeroVentas)
                {
                    contadorNumeroVentas = empleados[empleado];
                    mejorVendedor = empleado;
                }
            }

            return mejorVendedor;
        }


        private string prodctoMasVendido(List<DetalleVentaModel> productos)
        {
            string productoMasVendido = "";
            int cantidadProducto = 0;


            foreach(DetalleVentaModel producto in productos)
            {
                if(producto.cantidad > cantidadProducto)
                {
                    productoMasVendido = producto.producto.nombre;
                    cantidadProducto = producto.cantidad;

                }
            }
            return productoMasVendido;
        }

        private string mejorVenderdorDia()
        {
            List<Dictionary<string, dynamic>> mes = resumen["dia"];
            string mejorVendedor = "";
            int contadorNumeroVentas = 0;

            Dictionary<string, int> empleados = new Dictionary<string, int>();
            foreach (Dictionary<string, dynamic> venta_y_detalle in mes)
            {
                VentaModel venta = venta_y_detalle["venta"];

                if (empleados.ContainsKey(venta.responzable))
                {
                    empleados[venta.responzable] += 1;
                }
                else
                {
                    empleados.Add(venta.responzable, 1);
                }
            }

            foreach (string empleado in empleados.Keys)
            {
                if (empleados[empleado] > contadorNumeroVentas)
                {
                    contadorNumeroVentas = empleados[empleado];
                    mejorVendedor = empleado;
                }
            }

            return mejorVendedor;
        }

        private void label5_Click(object sender, EventArgs e)
        {

        }

        private void Estadiscticas_Load(object sender, EventArgs e)
        {

        }

        private void lbVendedorMes_Click(object sender, EventArgs e)
        {

        }

        private void lbProductoMes_Click(object sender, EventArgs e)
        {

        }

        private void lbVendedorDia_Click(object sender, EventArgs e)
        {

        }

        private void lbProductDia_Click(object sender, EventArgs e)
        {

        }

        private void pictureBox2_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}
