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;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;

namespace Vista
{
    public partial class FrmProducto : Form
    {
        private Producto nuevoproducto = new Producto();
        private bool mod = false;
        public FrmProducto(Producto? producto = null)
        {
            InitializeComponent();
            CargarCategorias();
            CargarTabla();
            cargarcombo();

            if (producto != null)
            {
                nuevoproducto = producto;
                mod = true;
                InicializarFormulario();
            }
        }
        private void cargarcombo()
        {
            comboBox1.DataSource = Enum.GetValues(typeof(EnvaseTipo));
        }
        private void InicializarFormulario()
        {
            numId.Value = nuevoproducto.Id;
            numId.Enabled = false;
            txtNombre.Text = nuevoproducto.Nombre;
            numPrecio.Value = (decimal)nuevoproducto.Precio;
            checkHabilitado.Checked = nuevoproducto.Habilitado;
            cmbCategoria.SelectedValue = nuevoproducto.Categoria.Id;
            dgvProveedorAñadido.DataSource = nuevoproducto.ListarProveedores();

        }

        private void CargarTabla()
        {
            dgvProveedor.DataSource = null;
            dgvProveedor.DataSource = ControladoraProductos.Instance.ListarProveedores();
            if (mod)
            {
                foreach (Proveedor prov in ControladoraProductos.Instance.ListarProveedores(nuevoproducto))
                {
                    nuevoproducto.AñadirProveedor(prov);
                }
            }
        }

        private void CargarCategorias()
        {
            // Obtener la lista de categorías desde la controladora
            var categorias = ControladoraCategorias.Instance.Listar();

            // Configurar el ComboBox para categorías
            cmbCategoria.DisplayMember = "Descripcion"; // Mostrar la propiedad Descripcion
            cmbCategoria.ValueMember = "Id"; // Usar la propiedad Id como valor

            // Asignar la lista de categorías al ComboBox
            cmbCategoria.DataSource = categorias;

            var listprod = ControladoraProductos.Instance.Listar();
            numId.Value = (listprod.Count > 0) ?
                listprod.Max(x => x.Id + 1) :
                0;
            numId.Enabled = false;
        }


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

            // Validar Nombre
            if (string.IsNullOrEmpty(txtNombre.Text)) { devolucion += "El nombre del producto no puede estar vacío.\n"; }
            if (txtNombre.Text.Length > 100) { devolucion += "El nombre del producto no puede superar los 100 caracteres.\n"; }

            // Validar Precio
            if (numPrecio.Value <= 0)
            {
                devolucion += "El precio debe ser mayor a cero.\n";
            }

            // Validar ID (Si es necesario)
            if (!mod && ControladoraProductos.Instance.Listar().Any(p => p.Id == (int)numId.Value))
            {
                devolucion += "Ya existe un producto con el mismo ID.\n";
            }

            // Validar Categoría Seleccionada
            if (cmbCategoria.SelectedItem == null)
            {
                devolucion += "Debe seleccionar una categoría.\n";
            }

            // Validar Tipo de Producto
            if (!checkBox1.Checked && comboBox1.SelectedItem == null)
            {
                devolucion += "Debe seleccionar un tipo de envase para el producto no perecedero.\n";
            }

            if (checkBox1.Checked) // Producto Perecedero
            {
                if (numericUpDown1.Value <= 0 || numericUpDown2.Value <= 0)
                {
                    devolucion += "Los meses hasta consumo preferente y vencimiento deben ser mayores a cero.\n";
                }
            }

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

        private void btnacept_Click(object sender, EventArgs e)
        {
            if (ValidarDatos())
            {

                if (checkBox1.Checked) // Producto Perecedero
                {
                    var productoPerecedero = new ProductoPercedero
                    {
                        Id = (int)numId.Value,
                        Nombre = txtNombre.Text,
                        Precio = (double)numPrecio.Value,
                        Habilitado = checkHabilitado.Checked,
                        Categoria = (Categoria)cmbCategoria.SelectedItem,
                        MesesHastaConsumoPreferente = (int)numericUpDown1.Value,
                        MesesHastaVencimiento = (int)numericUpDown2.Value,
                    };

                    foreach (var proveedor in nuevoproducto.ListarProveedores())
                    {
                        productoPerecedero.AñadirProveedor(proveedor);
                    }

                    string mensaje = mod
                        ? ControladoraProductos.Instance.Modificar(productoPerecedero)
                        : ControladoraProductos.Instance.Añadir(productoPerecedero);

                    MessageBox.Show(mensaje, "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else // Producto No Perecedero
                {
                    var productoNoPerecedero = new ProductoNoPercedero
                    {
                        Id = (int)numId.Value,
                        Nombre = txtNombre.Text,
                        Precio = (double)numPrecio.Value,
                        Habilitado = checkHabilitado.Checked,
                        Categoria = (Categoria)cmbCategoria.SelectedItem,
                        TipoDeEnvase = (EnvaseTipo)comboBox1.SelectedItem,
                    };
                    
                    foreach (var proveedor in nuevoproducto.ListarProveedores())
                    {
                        productoNoPerecedero.AñadirProveedor(proveedor);
                    }
                    string mensaje = mod
                        ? ControladoraProductos.Instance.Modificar(productoNoPerecedero)
                        : ControladoraProductos.Instance.Añadir(productoNoPerecedero);

                    MessageBox.Show(mensaje, "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }

                Close();
            }
        }

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

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            
        }

        private void btnaddProveedor_Click(object sender, EventArgs e)
        {
            if (dgvProveedor.SelectedRows.Count > 0)
            {
                foreach (DataGridViewRow selectedRow in dgvProveedor.SelectedRows)
                {
                    Proveedor proveedor = (Proveedor)selectedRow.DataBoundItem;
                    var checkcolicion = nuevoproducto.ListarProveedores().Contains(proveedor);
                    if (checkcolicion)
                    {
                        MessageBox.Show("El proveedor ya fue cargado");
                        return;
                    }
                    nuevoproducto.AñadirProveedor(proveedor);
                    dgvProveedorAñadido.DataSource = null;
                    dgvProveedorAñadido.DataSource = nuevoproducto.ListarProveedores();
                }
            }
            else
            {
                MessageBox.Show("Por favor, selecciona una fila para añadir Proveedor al producto.");
            }
        }
    

        private void btnrmProveedor_Click(object sender, EventArgs e)
        {
            try
            {
                if (dgvProveedorAñadido.SelectedRows.Count > 0)
                {
                    foreach (DataGridViewRow selectedRow in dgvProveedorAñadido.SelectedRows)
                    {
                        Proveedor proveedor = (Proveedor)selectedRow.DataBoundItem;
                        nuevoproducto.EliminarProveedor(proveedor);
                        dgvProveedorAñadido.DataSource = null;
                        dgvProveedorAñadido.DataSource = nuevoproducto.ListarProveedores();
                    }
                }
                else
                {
                    MessageBox.Show("Por favor, selecciona una fila para eliminar Proveedor del producto.");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show($"Error al eliminar proveedor: {ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            bool esPerecedero = checkBox1.Checked;

            numericUpDown1.Enabled = esPerecedero;
            numericUpDown2.Enabled = esPerecedero;
            comboBox1.Enabled = !esPerecedero;
        }

        private void numericUpDown2_ValueChanged(object sender, EventArgs e)
        {

        }

        private void numericUpDown1_ValueChanged(object sender, EventArgs e)
        {

        }
    }
}
