using System.Collections.ObjectModel;
using Entidades;
using Modelo;

namespace Controladora
{
    public class ControladoraOrdenDeCompras : Singleton<ControladoraOrdenDeCompras>
    {
        public string Añadir(OrdenDeCompra t)
        {
            if (t == null) return "El OrdenDeCompra es nulo fallo la carga";
            if (t.Proveedor == null) return "No se cargo el proveedor";
            
            // checkea que los detalles sean validos
            if (ProductoCheck(t.MostrarDetalles())) return "Hay referencias a productos no existentes";
            
            return (RepositorioOrdenDeCompra.Instance.Add(t)) ? 
                $"El OrdenDeCompra {t.Id} se cargo correctamente":
                $"Fallo la carga del OrdenDeCompra {t.Id}"; 
        }

<<<<<<< HEAD
        private bool ProductoCheck(ReadOnlyCollection<DetalleOrdenDeCompra> ldetalles)
        {
            bool ret = false;
            var lproductos = RepositorioProductos.Instance.Listar();
            Parallel.ForEach(ldetalles, (ll) =>
            {
                var producto = lproductos.FirstOrDefault(x => x.Id == ll.Producto.Id);
                ret = (producto == null) ? true : false;

            });
            return ret;
        }
        override public string Eliminar(OrdenDeCompra t)
=======
        public string Eliminar(OrdenDeCompra t)
>>>>>>> 675d86f (refactor: Cambiada la estructura de las controladoras)
        {
           if (t == null) return "El OrdenDeCompra es nulo fallo la carga";
           if (t.Id < 0) return "El Id esta mal cargado";

            return (RepositorioOrdenDeCompra.Instance.Del(t)) ? 
                $"El OrdenDeCompra {t.Id} se Elimino correctamente":
                $"Fallo la Eliminacion del OrdenDeCompra {t.Id}";         
        }

        public string Modificar(OrdenDeCompra t)
        {
            if (t == null) return "El OrdenDeCompra es nulo fallo la carga";

            return (RepositorioOrdenDeCompra.Instance.Mod(t)) ? 
                $"El OrdenDeCompra {t.Id} se Modifico correctamente":
                $"Fallo la Modificacion del OrdenDeCompra {t.Id}";    
        }

        public ReadOnlyCollection<OrdenDeCompra> Listar()
        {
            return RepositorioOrdenDeCompra.Instance.Listar();
        }

        public ReadOnlyCollection<DetalleOrdenDeCompra> ListarDetalles(OrdenDeCompra orden)
        {
            var ordenalistar = RepositorioOrdenDeCompra.Instance.Listar().First(x => x.Id == orden.Id);
            if (ordenalistar == null) return new ReadOnlyCollection<DetalleOrdenDeCompra>(new List<DetalleOrdenDeCompra>());
            return ordenalistar.MostrarDetalles();

        }

        public Presupuesto? MostrarPresupuestoPorId(Presupuesto? presupuesto)
        {
            if (presupuesto == null) return null;
            if (presupuesto.Id < 0) return null;
            var pres = RepositorioPresupuesto.Instance.Listar().First(x => x.Id == presupuesto.Id);
            return pres;
        }

        public object ListarProveedores()
        {
            return RepositorioProveedor.Instance.Listar()
                .Where(x => x.Habilitado == true)
                .ToList()
                .AsReadOnly();
        }

        public ReadOnlyCollection<DetallePresupuesto> ListarDetallesDePresupuesto(Presupuesto presupuesto)
        {
            Presupuesto pres = RepositorioPresupuesto.Instance.Listar().First(x => x.Id == presupuesto.Id);
            if (pres == null) return new ReadOnlyCollection<DetallePresupuesto>(new List<DetallePresupuesto>());
            return pres.MostrarDetalles();
        }

        public object ListarPresupuestosPorProveedorHabilitados(Proveedor proveedor)
        {
            if (proveedor == null) return null;
            if (proveedor.Cuit < 0) return null;
            var presupuestos = RepositorioPresupuesto.Instance.Listar()
                .Where(x => x.Proveedor.Cuit == proveedor.Cuit)
                .Where(x => x.Habilitado == true)
                .ToList()
                .AsReadOnly();
            return presupuestos;
        }
    }
}

