using Controladora;
using Entidades;
using System;
using System.Collections.Generic;
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 FrmOrdenDeCompra : Form
    {
        private OrdenDeCompra orden = new OrdenDeCompra();
        private List<DetalleOrdenDeCompra> detalles = new List<DetalleOrdenDeCompra>();
        private int detalleid = 0;
        public FrmOrdenDeCompra()
        {
            InitializeComponent();
            CargarDatos();
        }

        private void CargarDatos()
        {
            var listaOrden = ControladoraOrdenDeCompras.Instance.Listar();
            numId.Value = (listaOrden.Count > 0) ?
                listaOrden.Max(x => x.Id + 1) :
                0;
            numId.Enabled = false;

            //Asegúrate de que solo las columnas que deseas mostrar están visibles
            foreach (DataGridViewColumn column in dgvPresupuesto.Columns)
            {
                column.Visible = column.Name == "Id" || column.Name == "Fecha" || column.Name == "ProveedorNombre";
            }

            dgvProveedor.DataSource = null;
            dgvProveedor.DataSource = ControladoraOrdenDeCompras.Instance.ListarProveedores();

        }

        private void btnAddProducto_Click(object sender, EventArgs e)
        {
            if (dgvPresupuesto.SelectedRows.Count > 0)
            {
                dgvProveedor.Enabled = false;
                foreach (DataGridViewRow selectedRow in dgvPresupuesto.SelectedRows)
                {
                    Presupuesto? pres = new Presupuesto
                    {
                        Id = Convert.ToInt32(selectedRow.Cells["Id"].Value.ToString()),
                    };
                    pres = ControladoraOrdenDeCompras.Instance.MostrarPresupuestoPorId(pres);

                    if (pres == null)
                    {
                        MessageBox.Show("No existe Presupuesto por ese Id");
                        return;
                    }

                    var listadetalle = ControladoraOrdenDeCompras.Instance.ListarDetallesDePresupuesto(pres);

                    foreach (var detalle in listadetalle)
                    {

                        orden.AñadirDetalle(new DetalleOrdenDeCompra
                        {
                            Cantidad = detalle.Cantidad,
                            Id = detalleid++,
                            IdOrdenDeCompra = Convert.ToInt32(numId.Value),
                            MontoCU = detalle.MontoCUPropuesto,
                            Producto = detalle.Producto,
                            presupuesto = pres,
                        });
                    }

                    dgvOrdendeCompra.DataSource = null;
                    dgvOrdendeCompra.DataSource = orden.MostrarDetalles();
                    foreach (DataGridViewColumn column in dgvOrdendeCompra.Columns)
                    {
                        column.Visible = column.Name == "IdPresupuesto" || column.Name == "NombreProducto" || column.Name == "MontoCU"
                                         || column.Name == "Cantidad"|| column.Name == "SubTotal";
                    }
                    numTotal.Value = Convert.ToDecimal(orden.MontoTotal);
                }
            }
            else
            {
                MessageBox.Show("Por favor, selecciona una fila para añadir Proveedor al producto.");
            }
        }

        private void dgvPresupuesto_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            // Verifica si hay filas seleccionadas en dgvPresupuesto
            if (dgvPresupuesto.SelectedRows.Count == 0) return;

            // Recupera el ID del presupuesto seleccionado
            int presupuestoId = Convert.ToInt32(dgvPresupuesto.SelectedRows[0].Cells["Id"].Value.ToString());
            var presupuesto = new Presupuesto
            {
                Id = presupuestoId,
            };

            // Obtén los detalles del presupuesto usando el método de la controladora
            var detallesPresupuesto = ControladoraOrdenDeCompras.Instance.ListarDetallesDePresupuesto(presupuesto);

            // Crea una lista para mostrar el proveedor y los detalles del presupuesto
            var proveedorYDetalles = detallesPresupuesto.Select(d => new
            {

                d.NombreDelProducto,
                d.MontoCUPropuesto,
                d.Cantidad,
                d.Subtotal
            }).ToList();

            // Asigna la lista de proveedor y detalles al DataSource de dgvProveedor
            dgvDetalle.DataSource = null;
            dgvDetalle.DataSource = proveedorYDetalles;

            foreach (DataGridViewColumn column in dgvDetalle.Columns)
            {
                column.Visible = column.Name == "NombreDelProducto" || column.Name == "MontoCUPropuesto"
                                 || column.Name == "Cantidad" || column.Name == "Subtotal";
            }
        }

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

        private bool Validaciones()
        {
            string ret = "";
            if (numId.Value < 0) ret += "El numero de Id es invalido\n";

            if (orden.MostrarDetalles().Count == 0) ret += "No hay detalles en la orden de compra\n";

            if (ret == "")
            {
                return false;
            }
            MessageBox.Show(ret);
            return true;
        }
        private void btnAceptar_Click(object sender, EventArgs e)
        {
            if (Validaciones()) return;

            orden.Id = Convert.ToInt32(numId.Value);
            orden.Proveedor = (Proveedor)dgvProveedor.SelectedRows[0].DataBoundItem;
            string msg = ControladoraOrdenDeCompras.Instance.Añadir(orden);
            MessageBox.Show(msg);
            this.Close();
        }

        private void dgvProveedor_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (dgvProveedor.SelectedRows.Count == 0) return;

            var selectedRow = dgvProveedor.SelectedRows[0];
            var proveedor = new Proveedor
            {
                Cuit = Convert.ToInt64(selectedRow.Cells["Cuit"].Value),
            };

            var presupuestos = ControladoraOrdenDeCompras.Instance.ListarPresupuestosPorProveedorHabilitadosAceptado(proveedor);

            dgvPresupuesto.DataSource = null;
            dgvPresupuesto.DataSource = presupuestos;

            foreach (DataGridViewColumn column in dgvPresupuesto.Columns)
            {
                column.Visible = column.Name == "Id" || column.Name == "Fecha"
                                 || column.Name == "ProveedorNombre";
            }
        }

        private void btnrmPresupuesto_Click(object sender, EventArgs e)
        {
            if (dgvOrdendeCompra.SelectedRows.Count == 0) return;
            var selectedRow = dgvOrdendeCompra.SelectedRows[0];

            var presupuesto = new Presupuesto
            {
                Id = Convert.ToInt32(selectedRow.Cells["IdPresupuesto"].Value.ToString()),
            };

            var listaAEliminar = orden.MostrarDetalles().Where(x => x.IdPresupuesto == presupuesto.Id).ToList();
            foreach (var detalle in listaAEliminar)
            {
                orden.EliminarDetalle(detalle);
            }

            dgvOrdendeCompra.DataSource = null;
            dgvOrdendeCompra.DataSource = orden.MostrarDetalles();
            numTotal.Value = Convert.ToDecimal(orden.MontoTotal);
        }
    }
}
