using Controladora;
using Entidades;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Vista
{
    public partial class FrmFactura : Form
    {
        private Factura factura = new Factura();
        private int detalleid;
        public FrmFactura()
        {
            InitializeComponent();
            ActualizarGrilla();
            CargarDatos();

            cmbCliente.DisplayMember = "Cliente";
            cmbCliente.SelectedIndex = -1;
        }

        private void ActualizarGrilla()
        {
            dgvProductos.DataSource = null;
            dgvProductos.DataSource = ControladoraFacturas.Instance.ListarProductos();

            dgvDetalles.AutoGenerateColumns = false;

            // Definir las columnas manualmente
            dgvDetalles.Columns.Add(new DataGridViewTextBoxColumn
            {
                DataPropertyName = "Id", // Usa la propiedad NombreProducto
                HeaderText = "Id",
                Name = "Id"
            });
            dgvDetalles.Columns.Add(new DataGridViewTextBoxColumn
            {
                DataPropertyName = "Producto", // Usa la propiedad NombreProducto
                HeaderText = "Producto",
                Name = "Producto"
            });
            dgvDetalles.Columns.Add(new DataGridViewTextBoxColumn
            {
                DataPropertyName = "CantidadDeProductos",
                HeaderText = "Cantidad",
                Name = "CantidadDeProductos"
            });
            dgvDetalles.Columns.Add(new DataGridViewTextBoxColumn
            {
                DataPropertyName = "PrecioUnitario",
                HeaderText = "PrecioUnitario"
            });
            dgvDetalles.Columns.Add(new DataGridViewTextBoxColumn
            {
                DataPropertyName = "Subtotal",
                HeaderText = "Subtotal"
            });

        }

        private void CargarDatos()
        {
            // Asignar la lista de clientes como origen de datos para el ComboBox
            cmbCliente.DataSource = ControladoraFacturas.Instance.ListarClientes();

            // Establecer la propiedad para mostrar el nombre del cliente en el ComboBox
            cmbCliente.DisplayMember = "NombreCompleto";

            var listdetalle = ControladoraFacturas.Instance.Listar();
            numid.Value = (listdetalle.Count > 0) ?
                listdetalle.Max(x => x.Id + 1) :
                0;

            numid.Enabled = false; // Deshabilitar el control para que no se pueda modificar

            numtotal.Enabled = false; // Deshabilitar el control para que no se pueda modificar

            // Recuperar los lotes asociados a la factura y actualizar el DataGridView
            //            var listaDetalles = ControladoraFacturas.Instance.ListarDetallesFactura(factura);

            // Actualizar el total
            ActualizarTotal();
        }

        private void ActualizarTotal()
        {
            // Recalcular el total de la factura
            decimal total = 0;
            foreach (var detalle in factura.MostrarDetalles())
            {
                total += (decimal)(detalle.Producto.Precio * detalle.Cantidad);
            }
            numtotal.Value = total;
        }

        private bool ValidarDatos()
        {
            string devolucion = "";

            if (string.IsNullOrEmpty(numid.Text)) devolucion += "El ID no puede ser nulo o vacío\n";
            if (cmbCliente.SelectedIndex == -1) devolucion += "Debe seleccionar un cliente\n";

            if (devolucion == "")
            {
                return true;
            }
            else
            {
                MessageBox.Show(devolucion, "Errores de Validación", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return false;
            }
        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            // Validar los datos antes de continuar
            if (ValidarDatos())
            {
                factura.Total = Convert.ToDouble(numtotal.Value);
                factura.Fecha = datepick.Value;
                factura.Id = Convert.ToInt32(numid.Value);
                factura.Cliente = ControladoraFacturas.Instance.ListarClientes().First(x => x.NombreCompleto == cmbCliente.SelectedValue.ToString());

                string mensaje = ControladoraFacturas.Instance.Añadir(factura);
                MessageBox.Show(mensaje, "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);
                Close();
            }
        }

        private void btnAddDetalle_Click(object sender, EventArgs e)
        {
            // Validar los datos antes de crear el detalle
            if (ValidarDatosdetalle()) return;
            if (dgvProductos.SelectedRows.Count > 0)
            {
                foreach (DataGridViewRow selectedRow in dgvProductos.SelectedRows)
                {
                    Producto producto = (Producto)selectedRow.DataBoundItem;
                    var checkcolicion = factura.MostrarDetalles().Count(x => x.Producto.Id == producto.Id);
                    if (checkcolicion != 0)
                    {
                        MessageBox.Show("El Producto ya fue cargado");
                        return;
                    }

                    factura.AñadirDetalle(new DetalleFactura
                    {
                        Id = int.Parse(detalleid++.ToString()),
                        Cantidad = (int)numCantidad.Value,
                        IdFactura = factura.Id,
                        Producto = ControladoraProductos.Instance.Listar().First(x => x.Id == producto.Id),
                        Subtotal = producto.Precio * Convert.ToInt32(numCantidad.Value),
                    });
                    ActualizarGrillaDetalles();
                }
            }
        }
        private void ActualizarGrillaDetalles()
        {
            var detalles = factura.MostrarDetalles();
            dgvDetalles.DataSource = null;
            if (detalles.Any())
            {
                var loteDatos = detalles.Select(detalle => new
                {
                    Id = detalle.Id,
                    Producto = detalle.Producto.Nombre,
                    CantidadDeProductos = detalle.Cantidad,
                    Subtotal = detalle.Subtotal,
                    PrecioUnitario = detalle.Producto.Precio,
                }).ToList();

                dgvDetalles.DataSource = loteDatos;
                numtotal.Value = (Decimal)loteDatos.Sum(x => x.Subtotal);
            }
        }


        // metodo para validar los datos del detalle
        private bool ValidarDatosdetalle()
        {
            string devolucion = "";

            // Validar la selección del producto
            if (dgvProductos.CurrentRow == null)
                devolucion += "Debe seleccionar un producto para añadir al lote\n";

            // Validar la cantidad de productos
            if (numCantidad.Value <= 0)
                devolucion += "La cantidad de productos debe ser mayor que cero\n";

            if (devolucion == "")
            {
                return false;
            }
            else
            {
                MessageBox.Show(devolucion, "Errores de Validación", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return true;
            }
        }

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

        private void btnEliminar_Click(object sender, EventArgs e)
        {
            if (dgvDetalles.SelectedRows.Count > 0)
            {
                foreach (DataGridViewRow selectedRow in dgvDetalles.SelectedRows)
                {
                    DetalleFactura det = new DetalleFactura
                    {
                        Id = Convert.ToInt32(selectedRow.Cells["Id"].Value),
                    };
                    var detalleAborrar = factura.MostrarDetalles().First(x => x.Id == det.Id);
                    factura.EliminarDetalle(detalleAborrar);
                    ActualizarGrillaDetalles();
                    detalleid--;
                }
            }
            else
            {
                MessageBox.Show("Por favor, selecciona una fila para eliminar Proveedor del producto.");
            }
        }
    }
}