using Controladora;
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;

using System.Collections.ObjectModel;
using System.Linq;
using System.Windows.Forms;
using Controladora;
using Entidades;

namespace Vista
{
    public partial class FrmProductos : Form
    {
        public FrmProductos()
        {
            InitializeComponent();
            ConfigurarDataGridView();
            ConfigurarDataGridViewPerecedero();
            ConfigurarDataGridViewNoPerecedero();
            ActualizarGrilla();

        }
        private void ConfigurarDataGridViewNoPerecedero()
        {
            dgvNoPercedero.AutoGenerateColumns = false;

            // Crear una columna para el nombre
            var colNombre = new DataGridViewTextBoxColumn
            {
                DataPropertyName = "Nombre",
                HeaderText = "Nombre",
                Name = "Nombre",
                Width = 150
            };

            // Crear una columna para el tipo de envase
            var colTipoDeEnvase = new DataGridViewTextBoxColumn
            {
                DataPropertyName = "TipoDeEnvase",
                HeaderText = "Tipo de Envase",
                Name = "TipoDeEnvase",
                Width = 200
            };

            // Limpiar columnas existentes
            dgvNoPercedero.Columns.Clear();

            // Agregar las columnas al DataGridView
            dgvNoPercedero.Columns.Add(colNombre);
            dgvNoPercedero.Columns.Add(colTipoDeEnvase);
        }
        private void ConfigurarDataGridViewPerecedero()
        {
            dgvPercedero.AutoGenerateColumns = false;

            // Crear una columna para el nombre
            var colNombre = new DataGridViewTextBoxColumn
            {
                DataPropertyName = "Nombre",
                HeaderText = "Nombre",
                Name = "Nombre",

            };

            // Crear una columna para los meses hasta consumo preferente
            var colMesesHastaConsumoPreferente = new DataGridViewTextBoxColumn
            {
                DataPropertyName = "MesesHastaConsumoPreferente",
                HeaderText = "Meses Hasta Consumo Preferente",
                Name = "MesesHastaConsumoPreferente",

            };

            // Crear una columna para los meses hasta vencimiento
            var colMesesHastaVencimiento = new DataGridViewTextBoxColumn
            {
                DataPropertyName = "MesesHastaVencimiento",
                HeaderText = "Meses Hasta Vencimiento",
                Name = "MesesHastaVencimiento",

            };

            // Limpiar columnas existentes
            dgvPercedero.Columns.Clear();

            // Agregar las columnas al DataGridView
            dgvPercedero.Columns.Add(colNombre);
            dgvPercedero.Columns.Add(colMesesHastaConsumoPreferente);
            dgvPercedero.Columns.Add(colMesesHastaVencimiento);
        }
        private void ConfigurarDataGridView()
        {
            dgvProductos.AutoGenerateColumns = false;

            // Crear una columna para el ID
            var colId = new DataGridViewTextBoxColumn
            {
                DataPropertyName = "Id",
                HeaderText = "Id",
                Name = "Id"
            };

            // Crear una columna para el nombre
            var colNombre = new DataGridViewTextBoxColumn
            {
                DataPropertyName = "Nombre",
                HeaderText = "Nombre",
                Name = "Nombre"
            };

            // Crear una columna para el precio
            var colPrecio = new DataGridViewTextBoxColumn
            {
                DataPropertyName = "Precio",
                HeaderText = "Precio",
                Name = "Precio"
            };
            var colHabilitado = new DataGridViewCheckBoxColumn
            {
                DataPropertyName = "Habilitado",
                HeaderText = "Habilitado",
                Name = "Habilitado"
            };
            // Crear una columna para la categoría (mostrando la descripción)
            var colCategoria = new DataGridViewTextBoxColumn
            {
                DataPropertyName = "CategoriaDescripcion",
                HeaderText = "Categoría",
                Name = "Categoria"
            };

            var colPercedero = new DataGridViewTextBoxColumn
            {
                DataPropertyName = "EsPerecedero",
                HeaderText = "EsPerecedero",
                Name = "EsPerecedero"
            };


            // Agregar las columnas al DataGridView
            dgvProductos.Columns.Add(colId);
            dgvProductos.Columns.Add(colNombre);
            dgvProductos.Columns.Add(colPrecio);
            dgvProductos.Columns.Add(colHabilitado);
            dgvProductos.Columns.Add(colCategoria);
            dgvProductos.Columns.Add(colPercedero);
        }

        private void ActualizarGrilla()
        {
            // Obtén todos los productos de la controladora o la fuente de datos
            var todosLosProductos = ControladoraProductos.Instance.Listar();

            // Filtra los productos perecederos y no perecederos
            var productosPerecederos = todosLosProductos.OfType<ProductoPercedero>().ToList();
            var productosNoPerecederos = todosLosProductos.OfType<ProductoNoPercedero>().ToList();
            dgvPercedero.DataSource = null; // Limpiar la fuente de datos
            dgvNoPercedero.DataSource = null; // Limpiar la fuente de datos


            dgvProductos.DataSource = null;
            dgvCategorias.DataSource = null;
            var categorias = ControladoraProductos.Instance.ListarCategorias();
            dgvCategorias.DataSource = categorias;

            // Obtener la lista de productos y proyectar los datos
            var productos = ControladoraProductos.Instance.Listar()
                .Select(p => new
                {
                    p.Id,
                    p.Nombre,
                    p.Precio,
                    p.Habilitado,
                    CategoriaDescripcion = p.Categoria != null ? p.Categoria.Descripcion : string.Empty,
                    p.EsPerecedero
                })
                .ToList();

            dgvProductos.DataSource = productos;
        }

        private void BtnAdd_Click(object sender, EventArgs e)
        {
            var form = new FrmProducto();
            form.ShowDialog();
            ActualizarGrilla();
        }

        private void BtnEliminar_Click(object sender, EventArgs e)
        {
            if (dgvProductos.SelectedRows.Count == 0)
            {
                MessageBox.Show("Seleccione una línea para eliminar");
                return;
            }

            // Recorre las filas seleccionadas
            foreach (DataGridViewRow fila in dgvProductos.SelectedRows)
            {
                try
                {
                    // Obtén el ID del producto desde la columna "colId"
                    int id = Convert.ToInt32(fila.Cells["Id"].Value);

                    // Busca el producto con el ID correspondiente
                    var producto = ControladoraProductos.Instance.Listar().FirstOrDefault(p => p.Id == id);

                    if (producto != null)
                    {
                        // Llama al método Eliminar pasando el objeto Producto
                        string devolucion = ControladoraProductos.Instance.Eliminar(producto);
                        MessageBox.Show(devolucion);
                    }
                    else
                    {
                        MessageBox.Show($"No se encontró el producto con el ID {id}");
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show($"Error al eliminar el producto: {ex.Message}");
                }
            }

            // Actualiza la grilla después de eliminar
            ActualizarGrilla();
        }

        public void ActualizarGrillaGeneralizaciones()
        {
            dgvNoPercedero.DataSource = null;
            dgvPercedero.DataSource = null;

            var selectedRow = dgvProductos.SelectedRows[0];
            var Producto = new Entidades.Producto
            {
                Id = Convert.ToInt32(selectedRow.Cells["Id"].Value)
            };
            bool esPercedero = Convert.ToBoolean(selectedRow.Cells["EsPerecedero"].Value);
            if (esPercedero)
            {
                ProductoPercedero prod = (ProductoPercedero)ControladoraProductos.Instance.MostrarPorId(Producto);
                if (prod == null) return;

                dgvPercedero.DataSource = new List<ProductoPercedero> { prod };
            }
            else
            {
                ProductoNoPercedero prod = (ProductoNoPercedero)ControladoraProductos.Instance.MostrarPorId(Producto);
                if (prod == null) return;

                dgvNoPercedero.DataSource = new List<ProductoNoPercedero> { prod };
            }
        }
        private void MostrarStock()
        {
            var selectedRow = dgvProductos.SelectedRows[0];
            var Producto = new Entidades.Producto
            {
                Id = Convert.ToInt32(selectedRow.Cells["Id"].Value)
            };
            numStock.Value = ControladoraProductos.Instance.MostrarStock(Producto);
        }
        private void dgvProductos_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (dgvProductos.SelectedRows.Count == 0) return;
            ActualizarGrillaProveedores();
            ActualizarGrillaGeneralizaciones();
            MostrarStock();
        }

        private void btnModificar_Click(object sender, EventArgs e)
        {
            if (dgvProductos.SelectedRows.Count < 1)
            {
                MessageBox.Show("Seleccione una línea para modificar");
                return;
            }

            Producto producto = new Producto
            {
                Id = Convert.ToInt32(dgvProductos.SelectedRows[0].Cells["Id"].Value),
                Nombre = dgvProductos.SelectedRows[0].Cells["Nombre"].Value as String,
                Precio = Convert.ToDouble(dgvProductos.SelectedRows[0].Cells["Precio"].Value),
                Habilitado = Convert.ToBoolean(dgvProductos.SelectedRows[0].Cells["Habilitado"].Value),
                Categoria = ControladoraCategorias.Instance.Listar().FirstOrDefault(c => c.Descripcion == dgvProductos.SelectedRows[0].Cells["Categoria"].Value.ToString())
            };
            foreach (Proveedor prov in ControladoraProductos.Instance.ListarProveedores(producto))
            {
                producto.AñadirProveedor(prov);
            }

            var formModificar = new FrmProducto(producto);
            formModificar.ShowDialog();
            ActualizarGrilla();
            ActualizarGrillaProveedores();
        }
        private void ActualizarGrillaProveedores()
        {
            if (dgvProductos.SelectedRows.Count > 0)
            {
                Producto producto = new Producto
                {
                    Id = Convert.ToInt32(dgvProductos.SelectedRows[0].Cells["Id"].Value),
                };
                dgvProveedores.DataSource = ControladoraProductos.Instance.ListarProveedores(producto);
            }
        }

        private void btnCrearCategoria_Click(object sender, EventArgs e)
        {
            var form = new AddCategoria();
            form.ShowDialog();
            ActualizarGrilla();
        }
    }
}

