using bdHerramientaCACOA;
using bdHerramientaCACOA.db;
using bdHerramientaCACOA.dbcontext;
using bdHerramientaCACOA.HerramientaURBAN;
using BlazorBootstrap;
using ClosedXML.Excel;
using DocumentFormat.OpenXml.Office2013.Drawing.ChartStyle;
using HerramientaCASA.Components.Pages;
using HerramientaCASA.Components.Pages.HerramientaCASATabs;
using HerramientaCASA.Model;
using HerramientaCASA.ViewModel;
using IbanNet;
using Microsoft.AspNetCore.Components;
using System.Text;
using static bdHerramientaCACOA.CASA;
using static HerramientaCASA.Components.Pages.ConfiguracionPages.ConvenioColectivo;

namespace HerramientaCASA
{
    public class UtilidadesCASA
    {
        public static int crearObjeto(tsHerramientasCACOA bd, TiposSimulaciones tipoSimulacion, string jsonObjeto, string descripcion, string nombreFichero, int idUsuario)
        {
            int idtipoFichero = bd.enumeraciones.First(x => x.Codigo == "TIPFIC.JSON").idEnumeracion;
            int idtipoSimulacion = bd.enumeraciones.First(x => x.Codigo == obtenerTipoSimulacion(tipoSimulacion)).idEnumeracion;

            bdHerramientaCACOA.db.ficheros ficheroCASA = new bdHerramientaCACOA.db.ficheros()
            {
                FechaCreacion = DateTime.Now,
                idTipo = idtipoFichero,
                Fichero = Encoding.UTF8.GetBytes(jsonObjeto),
                NombreFichero = nombreFichero
            };

            bdHerramientaCACOA.db.simulaciones simulacion = new bdHerramientaCACOA.db.simulaciones()
            {

                idCodigo = idUsuario,
                idTipoSimulacion = idtipoSimulacion,
                Descripcion = descripcion,
                idFicheroJSONNavigation = ficheroCASA,
                FechaCreacion = DateTime.Now
            };

            bd.simulaciones.Add(simulacion);
            bd.SaveChanges();
            return simulacion.idSimulacion;
        }
        public static void actualziarObjeto(tsHerramientasCACOA bd, string jsonObjeto, string descripcion, string idSimulacion)
        {
            simulaciones simulacionObtenida = bd.simulaciones.First(x => x.idSimulacion == int.Parse(idSimulacion));

            ficheros ficheroObtenido = bd.ficheros.First(x => x.idFichero == simulacionObtenida.idFicheroJSON);

            ficheroObtenido.Fichero = Encoding.UTF8.GetBytes(jsonObjeto);

            simulacionObtenida.FechaModificacion = DateTime.Now;
            simulacionObtenida.Descripcion = descripcion;

            bd.ficheros.Update(ficheroObtenido);
            bd.simulaciones.Update(simulacionObtenida);

            bd.SaveChanges();
        }
        public static string obtenerTipoSimulacion(TiposSimulaciones simulacion)
        {
            string tipoSimulacion = "";

            switch (simulacion)
            {
                case TiposSimulaciones.CASA:
                    tipoSimulacion = "TIPOHERRAMIENTA.CASA";
                    break;
                case TiposSimulaciones.BAJA:
                    tipoSimulacion = "TIPOHERRAMIENTA.BAJAS";
                    break;
                case TiposSimulaciones.LICITACIONCASA:
                    tipoSimulacion = "TIPOHERRAMIENTA.LICITACIONCASA";
                    break;
                case TiposSimulaciones.URBAN:
                    tipoSimulacion = "TIPOHERRAMIENTA.URBAND";
                    break;
                case TiposSimulaciones.URBANDSIMP:
                    tipoSimulacion = "TIPOHERRAMIENTA.URBANDSIMP";
                    break;
            }
            ;

            return tipoSimulacion;
        }
        public static void guardarEnumeracion(tsHerramientasCACOA bd, enumeraciones nuevaEnumeracion, string codigo, bool nuevoElemento = true, enumeraciones enumeracionObtenida = null)
        {
            try
            {
                if (nuevoElemento)
                {

                    int grupoEnum = (int)bd.enumeraciones.First(x => x.Codigo.Contains(codigo)).idGrupoEnumeracion;

                    nuevaEnumeracion.Descripcion = nuevaEnumeracion.ValorAlfabetico1.ToUpper();
                    nuevaEnumeracion.Codigo = codigo + "." + nuevaEnumeracion.ValorAlfabetico1.ToUpper();
                    nuevaEnumeracion.Codigo = nuevaEnumeracion.Codigo.Trim().Replace(" ", "");

                    nuevaEnumeracion.idGrupoEnumeracion = grupoEnum;
                    bd.enumeraciones.Add(nuevaEnumeracion);
                }
                else
                {
                    enumeracionObtenida.ValorAlfabetico1 = nuevaEnumeracion.ValorAlfabetico1;
                    enumeracionObtenida.ValorNumerico1 = nuevaEnumeracion.ValorNumerico1;
                    enumeracionObtenida.ValorNumerico2 = nuevaEnumeracion.ValorNumerico2;
                    enumeracionObtenida.ValorAlfabeticoLargo = nuevaEnumeracion.ValorAlfabeticoLargo;
                    enumeracionObtenida.Descripcion = nuevaEnumeracion.ValorAlfabetico1.ToUpper();
                    //enumeracionObtenida.Codigo = codigo + "." + nuevaEnumeracion.ValorAlfabetico1.ToUpper();
                    //enumeracionObtenida.Codigo = nuevaEnumeracion.Codigo.Trim().Replace(" ", "");

                    bd.enumeraciones.Update(enumeracionObtenida);
                }

                var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD");
                cambiarFecha.Fecha1 = DateTime.Now;
                bd.enumeraciones.Update(cambiarFecha);
            }
            catch (Exception ex)
            {

            }

        }

        public static void eliminarEnumeracion(tsHerramientasCACOA bd, enumeraciones enumeracionObtenida)
        {
            try
            {
                bd.enumeraciones.Remove(enumeracionObtenida);
                var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD");
                cambiarFecha.Fecha1 = DateTime.Now;
                bd.enumeraciones.Update(cambiarFecha);
            }
            catch (Exception ex)
            {

            }

        }

        public static void actualizarFactorCorrecion(tsHerramientasCACOA bd, factorescorreccion factorCorrecc, factorescorreccion facturaEdit)
        {
            try
            {
                factorCorrecc.Descripcion = facturaEdit.Descripcion;
                factorCorrecc.Coeficiente = facturaEdit.Coeficiente;

                bd.factorescorreccion.Update(factorCorrecc);

                var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD");
                cambiarFecha.Fecha1 = DateTime.Now;
                bd.enumeraciones.Update(cambiarFecha);
            }
            catch (Exception ex)
            {

            }
        }

        public static void crearFactorCorrecion(tsHerramientasCACOA bd, factorescorreccion factorCorrecc)
        {
            try
            {
                string descripcion = factorCorrecc.Descripcion;
                factorCorrecc.Descripcion = descripcion;

                bd.factorescorreccion.Add(factorCorrecc);
                var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD");
                cambiarFecha.Fecha1 = DateTime.Now;
                bd.enumeraciones.Update(cambiarFecha);
            }
            catch (Exception ex)
            {

            }
        }

        public static void eliminarFactorCorrecion(tsHerramientasCACOA bd, factorescorreccion factorObtenido)
        {
            try
            {
                //Comprobamos si es el ultimo de su especie
                var total = bd.factorescorreccion.Where(x => x.idEnumeracion == factorObtenido.idEnumeracion).Count();

                var idenu = factorObtenido.idEnumeracion;
                bd.factorescorreccion.Remove(factorObtenido);
                bd.SaveChanges();
                if (total == 1)
                {
                    var enu = bd.enumeraciones.First(x => x.idEnumeracion == idenu);
                    bd.enumeraciones.Remove(enu);
                }
                var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD");
                cambiarFecha.Fecha1 = DateTime.Now;
                bd.enumeraciones.Update(cambiarFecha);
            }
            catch (Exception ex)
            {

            }

        }
        public static void actualizarPuntoInformacion(tsHerramientasCACOA bd, puntosinformacion puntoOrig, puntosinformacion puntoEdit)
        {
            try
            {
                puntoOrig.Descripcion = puntoEdit.Descripcion;
                puntoOrig.Titulo = puntoEdit.Titulo;

                bd.puntosinformacion.Update(puntoOrig);

                var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD");
                cambiarFecha.Fecha1 = DateTime.Now;
                bd.enumeraciones.Update(cambiarFecha);
            }
            catch (Exception ex)
            {

            }
        }

        //public static void actualizarCosteDespachoProfesional(tsHerramientasCACOA bd, costedespachoprofesional coste, costedespachoprofesional costeEdit)
        //{
        //    try
        //    {
        //        coste.numTrabajadores = costeEdit.numTrabajadores;
        //        coste.HorasProduccionAnuales = costeEdit.HorasProduccionAnuales;
        //        coste.CosteMinimoPersonal = costeEdit.CosteMinimoPersonal;
        //        coste.CosteMaxPersonal = costeEdit.CosteMaxPersonal;
        //        coste.CosteDirectoMedio = costeEdit.CosteDirectoMedio;
        //        coste.CostesDirectos = costeEdit.CostesDirectos;
        //        coste.CostesIndirectos = costeEdit.CostesIndirectos;
        //        coste.TotalDespachoProfesional = costeEdit.TotalDespachoProfesional;

        //        bd.costedespachoprofesional.Update(coste);

        //        var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD");
        //        cambiarFecha.Fecha1 = DateTime.Now;
        //        bd.enumeraciones.Update(cambiarFecha);
        //    }
        //    catch (Exception ex)
        //    {

        //    }
        //}
        //public static void crearCosteDespachoProfesional(tsHerramientasCACOA bd, costedespachoprofesional coste)
        //{
        //    try
        //    {
        //        //string descripcion = factorCorrecc.Descripcion;
        //        //factorCorrecc.Descripcion = descripcion;

        //        bd.costedespachoprofesional.Add(coste);

        //        var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD");
        //        cambiarFecha.Fecha1 = DateTime.Now;
        //        bd.enumeraciones.Update(cambiarFecha);
        //    }
        //    catch (Exception ex)
        //    {

        //    }
        //}

        //public static void eliminarCosteDespachoProfesional(tsHerramientasCACOA bd, costedespachoprofesional costeObtenido)
        //{
        //    try
        //    {
        //        bd.costedespachoprofesional.Remove(costeObtenido);
        //        var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD");
        //        cambiarFecha.Fecha1 = DateTime.Now;
        //        bd.enumeraciones.Update(cambiarFecha);
        //    }
        //    catch (Exception ex)
        //    {

        //    }

        //}

        public static void actualizarTipologias(tsHerramientasCACOA bd, tipologias tipologiaObtenida, tipologias tipologiaEdit)
        {
            try
            {
                tipologiaObtenida.Descripcion = tipologiaEdit.Descripcion;
                tipologiaObtenida.CoeficienteUso = tipologiaEdit.CoeficienteUso;

                bd.tipologias.Update(tipologiaObtenida);

                var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD");
                cambiarFecha.Fecha1 = DateTime.Now;
                bd.enumeraciones.Update(cambiarFecha);
            }
            catch (Exception ex)
            {

            }
        }
        public static void crearTipologia(tsHerramientasCACOA bd, tipologias tipologiaObtenida)
        {
            try
            {
                string descripcion = tipologiaObtenida.Descripcion;
                tipologiaObtenida.Descripcion = descripcion;

                bd.tipologias.Add(tipologiaObtenida);

                var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD");
                cambiarFecha.Fecha1 = DateTime.Now;
                bd.enumeraciones.Update(cambiarFecha);
            }
            catch (Exception ex)
            {

            }
        }

        public static void actualizarConvenioColectivo(tsHerramientasCACOA bd, conveniocolectivo convcol, conveniocolectivo concolEdit)
        {
            try
            {
                convcol.CosteAnualTrabajador = concolEdit.CosteAnualTrabajador;

                bd.conveniocolectivo.Update(convcol);

                var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD");
                cambiarFecha.Fecha1 = DateTime.Now;
                bd.enumeraciones.Update(cambiarFecha);
            }
            catch (Exception ex)
            {

            }
        }
        public static void actualizarConvenioColectivo(tsHerramientasCACOA bd, ConvenioProvincia concolEdit)
        {
            try
            {
                var gradSup = bd.conveniocolectivo.First(x => x.idConvenioColectivo == concolEdit.idGradoSup);
                gradSup.CosteAnualTrabajador = concolEdit.valorGradoSup;
                var gradMed = bd.conveniocolectivo.First(x => x.idConvenioColectivo == concolEdit.idGradoMedio);
                gradSup.CosteAnualTrabajador = concolEdit.valorGradoMed;
                var delin = bd.conveniocolectivo.First(x => x.idConvenioColectivo == concolEdit.idDelinPro);
                gradSup.CosteAnualTrabajador = concolEdit.valorDelinPro;
                var admin = bd.conveniocolectivo.First(x => x.idConvenioColectivo == concolEdit.idAdmin);
                gradSup.CosteAnualTrabajador = concolEdit.valorAdmin;

                var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD");
                cambiarFecha.Fecha1 = DateTime.Now;
                bd.enumeraciones.Update(cambiarFecha);
            }
            catch (Exception ex)
            {

            }
        }


        public static void crearConvenioColectivo(tsHerramientasCACOA bd, ConvenioProvincia concolEdit)
        {
            try
            {
                bdHerramientaCACOA.db.conveniocolectivo nuevoConvenio;

                var gradoSup = bd.enumeraciones.First(x => x.Codigo == "PUESTOTRABAJO.TECGRADSUP");
                var gradoMed = bd.enumeraciones.First(x => x.Codigo == "PUESTOTRABAJO.GESTPROY");
                var delin = bd.enumeraciones.First(x => x.Codigo == "PUESTOTRABAJO.DELINPROY");
                var admin = bd.enumeraciones.First(x => x.Codigo == "PUESTOTRABAJO.ADMIN");


                agregarConvenio(bd, concolEdit.valorGradoSup, concolEdit.idProvincia, gradoSup.idEnumeracion);
                agregarConvenio(bd, concolEdit.valorGradoMed, concolEdit.idProvincia, gradoMed.idEnumeracion);
                agregarConvenio(bd, concolEdit.valorDelinPro, concolEdit.idProvincia, delin.idEnumeracion);
                agregarConvenio(bd, concolEdit.valorAdmin, concolEdit.idProvincia, admin.idEnumeracion);


                var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD");
                cambiarFecha.Fecha1 = DateTime.Now;
                bd.enumeraciones.Update(cambiarFecha);
            }
            catch (Exception ex)
            {

            }
        }

        public static void eliminarConvenioColectivo(tsHerramientasCACOA bd, ConvenioProvincia convenioColectivo)
        {
            try
            {
                var listaConveniosBorrar = bd.conveniocolectivo.Where(x => x.idProvincia == convenioColectivo.idProvincia).ToList();

                bd.conveniocolectivo.RemoveRange(listaConveniosBorrar);

                var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD");
                cambiarFecha.Fecha1 = DateTime.Now;
                bd.enumeraciones.Update(cambiarFecha);
            }
            catch (Exception ex)
            {

            }

        }

        private static void agregarConvenio(tsHerramientasCACOA bd, double valor, string idProvincia, int idGrupo)
        {
            bd.conveniocolectivo.Add(new conveniocolectivo
            {
                idEnumeracion = idGrupo,
                idProvincia = idProvincia,
                CosteAnualTrabajador = valor
            });
        }

        public static void eliminarTipologia(tsHerramientasCACOA bd, tipologias tipologiaObtenida)
        {
            try
            {
                bd.tipologias.Remove(tipologiaObtenida);
                var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD");
                cambiarFecha.Fecha1 = DateTime.Now;
                bd.enumeraciones.Update(cambiarFecha);
            }
            catch (Exception ex)
            {

            }

        }

        public static void actualizarTipoProyecto(tsHerramientasCACOA bd, tipoproyectos proyecto, tipoproyectos proyectoEdit)
        {
            try
            {
                proyecto.Descripcion = proyectoEdit.Descripcion;
                proyecto.Abreviatura = proyectoEdit.Abreviatura;
                proyecto.idTipoDocumento = proyectoEdit.idTipoDocumento;


                bd.tipoproyectos.Update(proyecto);

                var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD");
                cambiarFecha.Fecha1 = DateTime.Now;
                bd.enumeraciones.Update(cambiarFecha);
            }
            catch (Exception ex)
            {

            }
        }


        public static void crearTipoProyecto(tsHerramientasCACOA bd, tipoproyectos proyecto)
        {
            try
            {
                bd.tipoproyectos.Add(proyecto);
                var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD");
                cambiarFecha.Fecha1 = DateTime.Now;
                bd.enumeraciones.Update(cambiarFecha);
            }
            catch (Exception ex)
            {

            }
        }

        public static void eliminarTipoProyecto(tsHerramientasCACOA bd, tipoproyectos proyecto)
        {
            try
            {
                //Comprobamos si es el ultimo de su especie
                var total = bd.tipoproyectos.Where(x => x.idTipoDocumento == proyecto.idTipoDocumento).Count();

                var idenu = proyecto.idTipoDocumento;
                bd.tipoproyectos.Remove(proyecto);
                bd.SaveChanges();
                if (total == 1)
                {
                    var enu = bd.enumeraciones.First(x => x.idEnumeracion == idenu);
                    bd.enumeraciones.Remove(enu);
                }
                var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD");
                cambiarFecha.Fecha1 = DateTime.Now;
                bd.enumeraciones.Update(cambiarFecha);
            }
            catch (Exception ex)
            {

            }

        }


        public static void actualizarDocumentacion(tsHerramientasCACOA bd, documentacion docu, documentacion docuEdit)
        {
            try
            {
                docu.Descripcion = docuEdit.Descripcion;
                docu.CoeficienteHoras = docuEdit.CoeficienteHoras;
                docu.Checkeable = docuEdit.Checkeable;

                bd.documentacion.Update(docu);

                var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD");
                cambiarFecha.Fecha1 = DateTime.Now;
                bd.enumeraciones.Update(cambiarFecha);
            }
            catch (Exception ex)
            {

            }
        }


        public static void crearDocumentacion(tsHerramientasCACOA bd, documentacion docu)
        {
            try
            {
                bd.documentacion.Add(docu);
                var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD");
                cambiarFecha.Fecha1 = DateTime.Now;
                bd.enumeraciones.Update(cambiarFecha);
            }
            catch (Exception ex)
            {

            }
        }

        public static void eliminarDocumentacion(tsHerramientasCACOA bd, documentacion docu)
        {
            try
            {
                bd.documentacion.Remove(docu);
                bd.SaveChanges();

                var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD");
                cambiarFecha.Fecha1 = DateTime.Now;
                bd.enumeraciones.Update(cambiarFecha);
            }
            catch (Exception ex)
            {

            }
        }



        public static void actualizarProyecto_Documentacion(tsHerramientasCACOA bd, tipoproyecto_documentacion docu, v_tipoproyecto_documentacion docuEdit)
        {
            try
            {
                docu.idtipoproyecto = docuEdit.idtipoproyecto;
                docu.iddocumentacion = docuEdit.iddocumentacion;
                docu.esMinima = docuEdit.esMinima;
                docu.esOpcional = docuEdit.esOpcional;
                docu.esNecesario = docuEdit.esNecesario;
                docu.orden = docuEdit.orden;

                bd.tipoproyecto_documentacion.Update(docu);

                var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD");
                cambiarFecha.Fecha1 = DateTime.Now;
                bd.enumeraciones.Update(cambiarFecha);
            }
            catch (Exception ex)
            {

            }
        }

        public static void crearProyecto_Documentacion(tsHerramientasCACOA bd, v_tipoproyecto_documentacion docu)
        {
            try
            {
                tipoproyecto_documentacion proyeDocu = new tipoproyecto_documentacion()
                {
                    idtipoproyecto = docu.idtipoproyecto,
                    iddocumentacion = docu.iddocumentacion,
                    esMinima = docu.esMinima,
                    esOpcional = docu.esOpcional,
                    esNecesario = docu.esNecesario,
                    orden = docu.orden,
                };

                bd.tipoproyecto_documentacion.Add(proyeDocu);

                var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD");
                cambiarFecha.Fecha1 = DateTime.Now;
                bd.enumeraciones.Update(cambiarFecha);
            }
            catch (Exception ex)
            {

            }
        }
        public static void eliminarProyecto_Documentacion(tsHerramientasCACOA bd, tipoproyecto_documentacion docu)
        {
            try
            {
                bd.tipoproyecto_documentacion.Remove(docu);
                bd.SaveChanges();

                var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD");
                cambiarFecha.Fecha1 = DateTime.Now;
                bd.enumeraciones.Update(cambiarFecha);
            }
            catch (Exception ex)
            {

            }
        }
        public static List<enumeraciones> devolverListadoOrdenadoEnumeracion(tsHerramientasCACOA bd, string codigoEnumeracion)
        {
            return bd.enumeraciones.Where(x => x.Codigo.Contains(codigoEnumeracion + ".")).OrderBy(x => x.Orden).ToList();
        }
        public enum TiposSimulaciones
        {
            CASA,
            BAJA,
            LICITACIONCASA,
            URBAN,
            URBANDSIMP
        }

        public static RenderFragment CreateTooltip(string titulo) => __builder =>
        {
            if (titulo != "") {
                __builder.OpenComponent(0, typeof(Tooltip));
                __builder.AddAttribute(1, "Title", titulo);
                __builder.AddAttribute(2, "class", "custom-tooltip");
                __builder.AddAttribute(3, "role", "button");
                __builder.AddAttribute(4, "ChildContent", (RenderFragment)(__builder2 =>
                {
                    __builder2.OpenComponent(5, typeof(Icon));
                    __builder2.AddAttribute(6, "Name", IconName.InfoCircleFill);
                    __builder2.AddAttribute(7, "Class", "text-primary ");
                    __builder2.CloseComponent();
                }));
                __builder.CloseComponent();
            }
        };

        public static void guardarEstadisticas(tsHerramientasCACOA bd, HerramientaCASA.UtilidadesCASA.TiposSimulaciones tipoSimulacion, string jsonObjeto, int idSimulador)
        {
            estadisticas estadisticas = new estadisticas();

            try
            {
                switch (tipoSimulacion)
                {
                    case TiposSimulaciones.CASA:
                        var casa = System.Text.Json.JsonSerializer.Deserialize<CASA>(jsonObjeto);
                        casa.CalcularFinales();

                        if (!comprobarExisteEstadistica(bd, idSimulador))
                        {
                            mapearEstadisticasCASA(bd,estadisticas,casa,idSimulador);
                            bd.estadisticas.Add(estadisticas);
                        }
                        else
                        {
                            var estadisticaExistente = bd.estadisticas.First(x => x.idSimulacion == idSimulador);
                            mapearEstadisticasCASA(bd,estadisticaExistente, casa, idSimulador);
                        }
                        break;
                    case TiposSimulaciones.BAJA:
                        break;
                    case TiposSimulaciones.LICITACIONCASA:
                        var licitacionCASA = System.Text.Json.JsonSerializer.Deserialize<LICITACIONES>(jsonObjeto);

                        if (!comprobarExisteEstadistica(bd, idSimulador))
                        {
                            mapearEstadisticasLicitacionCASA(bd,estadisticas, licitacionCASA, idSimulador);
                            bd.estadisticas.Add(estadisticas);
                        }
                        else
                        {
                            var estadisticaExistente = bd.estadisticas.First(x => x.idSimulacion == idSimulador);
                            mapearEstadisticasLicitacionCASA(bd, estadisticaExistente, licitacionCASA, idSimulador);
                        }

                        break;
                    case TiposSimulaciones.URBAN:
                        var urban = System.Text.Json.JsonSerializer.Deserialize<URBAN>(jsonObjeto);
                        urban.CalcularFinales();

                        if (!comprobarExisteEstadistica(bd, idSimulador))
                        {
                            mapearEstadisticasURBAN(estadisticas, urban, idSimulador);
                            bd.estadisticas.Add(estadisticas);
                        }
                        else
                        {
                            var estadisticaExistente = bd.estadisticas.First(x => x.idSimulacion == idSimulador);
                            mapearEstadisticasURBAN(estadisticaExistente, urban, idSimulador);
                        }
                        break;
                    case TiposSimulaciones.URBANDSIMP:

                        var licitacionUrban = System.Text.Json.JsonSerializer.Deserialize<bdHerramientaCACOA.LicitacionesURBAN>(jsonObjeto);

                        if (!comprobarExisteEstadistica(bd, idSimulador))
                        {
                            mapearEstadisticasLicitacionURBAN(estadisticas, licitacionUrban, idSimulador);
                            bd.estadisticas.Add(estadisticas);
                        }
                        else
                        {
                            var estadisticaExistente = bd.estadisticas.First(x => x.idSimulacion == idSimulador);
                            mapearEstadisticasLicitacionURBAN(estadisticaExistente, licitacionUrban, idSimulador);
                        }
                        break;
                }

                bd.SaveChanges();
            }
            catch (Exception ex) {
                throw new Exception(ex.Message);
            }
        }

        private static bool comprobarExisteEstadistica(tsHerramientasCACOA bd, int idSimulacion)
        {
            bool existeEstadistica = false;

            if (bd.estadisticas.Any(x=> x.idSimulacion == idSimulacion))
            {
                existeEstadistica = true;
            }
            return existeEstadistica;   
        }

        private static void mapearEstadisticasCASA(tsHerramientasCACOA bd,estadisticas estadistica, CASA casa, int idSimulador)
        {
            estadistica.idSimulacion = idSimulador;
            estadistica.numeroTrabajadores = casa.DespachoProfesional.Trabajadores.Sum(x => x.NumTrabajadores);
            estadistica.totalCosteAnual = casa.DespachoProfesional.CostesDirectosAnuales;
            estadistica.horasProduccion = casa.DespachoProfesional.HorasTotalesProduccion;
            estadistica.costeDirecto = casa.DespachoProfesional.CostesDirectos;
            estadistica.costeIndirecto = casa.DespachoProfesional.TasaCostesIndirectos;
            estadistica.costeVariable = casa.CostesProduccion.CostesVariables;
            estadistica.costeHoraDespachoProf = casa.DespachoProfesional.CosteHoraDespachoProfesional;
            estadistica.totalSupeficie = casa.TrabajoProfesional.Usos.Sum(x=> x.superficie);
            estadistica.totalFases = casa.TrabajoProfesional.FasesTrabajo.Sum(x => x.Porcentaje);
            
            estadistica.horasTPEDocumentacion = casa.TrabajoProfesional.HorasTPEDocumentacion;
            estadistica.horasTPEDireccionObra = casa.TrabajoProfesional.HorasTPEDireccion;
            estadistica.horasTPE = casa.TrabajoProfesional.TotalHorasTPE;
            estadistica.porcentajeExternalizacion = casa.CostesProduccion.CoeficienteCostesExternalizacion;
            estadistica.costeHoraExternalizacion = casa.CostesProduccion.CosteHoraExternalizacion;
            estadistica.plazoPresentacion = casa.CostesProduccion.PlazoPresentacionDocumentos;
            estadistica.costeProduccion = casa.CostesProduccion.CostesProduccionTrabProf;
            estadistica.porcentajeBeneficio = casa.CostesProduccion.Beneficio;
            estadistica.precioTrabajo = casa.CostesProduccion.PrecioTrabProf;
            estadistica.totalOtrosTrabajos = casa.CostesProduccion.TotalOtrosTrabajos;
            estadistica.precioEncargo = casa.CostesProduccion.PrecioDelEncargo;



            // Rellenar listado usos
            if (casa.TrabajoProfesional.Usos.Count != 0)
            {

                var listadoBorrar = bd.estadisticasusos.Where(x=> x.idSimulacion == idSimulador).ToList();
                bd.estadisticasusos.RemoveRange(listadoBorrar);

                foreach (var uso in casa.TrabajoProfesional.Usos)
                {

                    bd.estadisticasusos.Add(new estadisticasusos
                    {
                        idSimulacion = idSimulador,
                        superficie = uso.superficie,
                        idUso = uso.idGrupoTipologia,
                        idTipologia = uso.idTipologia,
                        idIntervencion = uso.idTipoIntervencion
                    });

                }

            }

            // Rellenar listado factores complejidad
            if (casa.TrabajoProfesional.FactoresComplejidad.Count != 0)
            {
                var listadoBorrar = bd.estadisticasfactores.Where(x => x.idsimulacion == idSimulador).ToList();
                bd.estadisticasfactores.RemoveRange(listadoBorrar);

                foreach (var factor in casa.TrabajoProfesional.FactoresComplejidad)
                {

                    bd.estadisticasfactores.Add(new estadisticasfactores
                    {
                        idsimulacion = idSimulador,
                        nombre = factor.Nombre,
                        coeficiente = factor.coeficiente,
                        tipo = "Complejidad"
                    });

                }
            }

            // Rellenar listado factores rendimiento
            if (casa.TrabajoProfesional.FactoresRendimiento.Count != 0)
            {
                var listadoBorrar = bd.estadisticasfactores.Where(x => x.idsimulacion == idSimulador).ToList();
                bd.estadisticasfactores.RemoveRange(listadoBorrar);

                foreach (var factor in casa.TrabajoProfesional.FactoresRendimiento)
                {

                    bd.estadisticasfactores.Add(new estadisticasfactores
                    {
                        idsimulacion = idSimulador,
                        nombre = factor.Nombre,
                        coeficiente = factor.coeficiente,
                        tipo = "Rendimiento"
                    });

                }
            }
        }

        private static void mapearEstadisticasLicitacionCASA(tsHerramientasCACOA bd, estadisticas estadistica, LICITACIONES licitacion, int idSimulador)
        {
            estadistica.idSimulacion = idSimulador;
            estadistica.costeHoraDespachoProf = licitacion.costeHoraProduccion;
            estadistica.totalSupeficie = licitacion.Usos.Sum(x => x.superficie);
            estadistica.totalFases = licitacion.FasesTrabajo.Sum(x=> x.Porcentaje);

            estadistica.horasTPE = licitacion.horasProduccion;
            estadistica.plazoPresentacion = licitacion.PlazoPresentacionDocumentos;
            estadistica.costeProduccion = licitacion.CostesProduccionTrabProf;
            estadistica.precioTrabajo = licitacion.PrecioTrabProf;
            estadistica.totalOtrosTrabajos = licitacion.TotalOtrosTrabajos;
            estadistica.precioEncargo = licitacion.PrecioDelEncargo;

            // Rellenar listado usos
            if (licitacion.Usos.Count != 0)
            {

                var listadoBorrar = bd.estadisticasusos.Where(x => x.idSimulacion == idSimulador).ToList();
                bd.estadisticasusos.RemoveRange(listadoBorrar);

                foreach (var uso in licitacion.Usos)
                {

                    bd.estadisticasusos.Add(new estadisticasusos
                    {
                        idSimulacion = idSimulador,
                        superficie = uso.superficie,
                        idUso = uso.idGrupoTipologia,
                        idTipologia = uso.idTipologia,
                        idIntervencion = uso.idTipoIntervencion
                    });

                }

            }
        }

        private static void mapearEstadisticasURBAN(estadisticas estadistica, URBAN urban, int idSimulador)
        {
            estadistica.idSimulacion = idSimulador;
            estadistica.numeroTrabajadores = urban.DespachoProfesional.Trabajadores.Sum(x => x.NumTrabajadores);
            estadistica.totalCosteAnual = urban.DespachoProfesional.CostesDirectosAnuales;
            estadistica.costeDirecto = urban.DespachoProfesional.CostesDirectos;
            estadistica.costeIndirecto = urban.DespachoProfesional.TasaCostesIndirectos;
            estadistica.costeVariable = urban.CostesProduccion.CostesVariables;
            estadistica.costeHoraDespachoProf = urban.DespachoProfesional.CosteHoraDespachoProfesional;

            //obtener tipodocumento
            estadistica.tipoDocumento = urban.Enumerados.TiposDeDocumentos.First(x=> x.idEnumeracion == urban.TrabajoProfesional.idTipoDocumentacion).ValorAlfabetico1;

            //obtener documento
            var listadoDocumentos = urban.Enumerados.ProyectosPorTipo(urban.TrabajoProfesional.idTipoDocumentacion);
            estadistica.documento = listadoDocumentos.First(x=> x.idtipoproyectos == urban.TrabajoProfesional.idTipoProyecto).Descripcion;
            
            //obtener datos necesarios
            var listadoDocumentacionNecesaria = urban.TrabajoProfesional.DatosNecesarios;
            estadistica.dato1 = listadoDocumentacionNecesaria[0].ValorNecesario.ToString();
            estadistica.dato2 = listadoDocumentacionNecesaria[1].ValorNecesario.ToString();

            var valorDato3 = listadoDocumentacionNecesaria[2].esCheckbox ? listadoDocumentacionNecesaria[2].esCheckbox.ToString() : listadoDocumentacionNecesaria[2].ValorNecesario.ToString();

            if (valorDato3.ToLower().Contains("false"))
            {
                estadistica.dato3 = "FALSO";
            }else if (valorDato3.ToLower().Contains("true"))
            {
                estadistica.dato3 = "VERDADERO";
            }
            else
            {
                estadistica.dato3 = valorDato3.ToString();
            }

            estadistica.totalFases = urban.TrabajoProfesional.FasesTrabajoProfesional.Sum(x => x.Porcentaje);
            estadistica.innovacion = urban.TrabajoProfesional.valorInstrumentos;
            estadistica.horasTPE = urban.TrabajoProfesional.horasTrabProfesional;
            estadistica.porcentajeExternalizacion = urban.CostesProduccion.CoeficienteCostesExternalizacion;
            estadistica.costeHoraExternalizacion = urban.CostesProduccion.CosteHoraExternalizacion;
            estadistica.plazoPresentacion = urban.CostesProduccion.PlazoPresentacionDocumentos;
            estadistica.costeProduccion = urban.CostesProduccion.CostesProduccionTrabProf;
            estadistica.porcentajeBeneficio = urban.CostesProduccion.Beneficio;
            estadistica.precioTrabajo = urban.CostesProduccion.PrecioTrabajoProfesional;


        }

        private static void mapearEstadisticasLicitacionURBAN(estadisticas estadistica, bdHerramientaCACOA.LicitacionesURBAN licitacionUrban, int idSimulador)
        {
            estadistica.idSimulacion = idSimulador;
            estadistica.costeHoraDespachoProf = licitacionUrban.CosteHP;

            //obtener tipodocumento
            estadistica.tipoDocumento = licitacionUrban.Enumerados.TiposDeDocumentos.First(x => x.idEnumeracion == licitacionUrban.TrabajoProfesional.idTipoDocumentacion).ValorAlfabetico1;

            //obtener documento
            var listadoDocumentos = licitacionUrban.Enumerados.ProyectosPorTipo(licitacionUrban.TrabajoProfesional.idTipoDocumentacion);
            estadistica.documento = listadoDocumentos.First(x => x.idtipoproyectos == licitacionUrban.TrabajoProfesional.idTipoProyecto).Descripcion;

            //obtener datos necesarios
            var listadoDocumentacionNecesaria = licitacionUrban.TrabajoProfesional.DatosNecesarios;
            estadistica.dato1 = listadoDocumentacionNecesaria[0].ValorNecesario.ToString();
            estadistica.dato2 = listadoDocumentacionNecesaria[1].ValorNecesario.ToString();

            var valorDato3 = listadoDocumentacionNecesaria[2].esCheckbox ? listadoDocumentacionNecesaria[2].esCheckbox.ToString() : listadoDocumentacionNecesaria[2].ValorNecesario.ToString();

            if (valorDato3.ToLower().Contains("false"))
            {
                estadistica.dato3 = "FALSO";
            }
            else if (valorDato3.ToLower().Contains("true"))
            {
                estadistica.dato3 = "VERDADERO";
            }
            else
            {
                estadistica.dato3 = valorDato3.ToString();
            }

            estadistica.totalFases = licitacionUrban.TrabajoProfesional.FasesTrabajoProfesional.Sum(x => x.Porcentaje);
            estadistica.innovacion = licitacionUrban.TrabajoProfesional.valorInstrumentos;
            estadistica.horasTPE = licitacionUrban.TrabajoProfesional.horasTrabProfesional;
            estadistica.plazoPresentacion = licitacionUrban.PlazoPresentacionDocumentos;
            estadistica.costeProduccion = licitacionUrban.CostesProduccionTrabProf;
            estadistica.precioTrabajo = licitacionUrban.PrecioDelTrabajo;
        }


        public static  double? comprobarNull(double? dato, int cantidadProyecto)
        {
            double? datoFinal = null;

            if (dato != null)
            {
                datoFinal = dato / cantidadProyecto;
            }

            return datoFinal;
        }


        public static bool comprobarFechas(DateTime fechaInicio, DateTime fechaFinal)
        {
            bool fechaValida = false;

            if (fechaFinal.Date >= fechaInicio.Date)
            {
                fechaValida = true;
            }

            return fechaValida;
        }


        public static bool comprobarFechasNulas(DateTime? fechaInicio, DateTime? fechaFinal)
        {
            bool fechaValida = false;

            if (fechaFinal != null  &&  fechaInicio != null)
            {
                fechaValida = true;
            }

            return fechaValida;
        }


        public static List<EstadistiaHerraCasaVM> rellenarListadoCASA(List<bdHerramientaCACOA.db.estadisticas> listadoEstadistica)
        {
            List<EstadistiaHerraCasaVM> listadoEstadisticasExcel = new List<EstadistiaHerraCasaVM> ();

            foreach (estadisticas estadistica in listadoEstadistica)
            {
                listadoEstadisticasExcel.Add(new EstadistiaHerraCasaVM
                {
                    idSimulacion = estadistica.idSimulacionNavigation?.Descripcion,
                    numeroTrabajadores = estadistica.numeroTrabajadores,
                    costeAnualTotal = estadistica.totalCosteAnual,
                    horasProduccion = estadistica.horasProduccion,
                    costesDirectos = estadistica.costeDirecto,
                    costesIndirectos = estadistica.costeIndirecto,
                    costesVariables = estadistica.costeVariable,
                    costeDespacho = estadistica.costeHoraDespachoProf,
                    totalSuperficie = estadistica.totalSupeficie,
                    porcentajeFases = estadistica.totalFases,
                    horasDocumentacion = estadistica.horasTPEDocumentacion,
                    horasDireccionObra = estadistica.horasTPEDireccionObra,
                    horasTrabajo = estadistica.horasTPE,
                    porcentajeExternalizacion = estadistica.porcentajeExternalizacion,
                    costeExternalizacion = estadistica.costeHoraExternalizacion,
                    plazoPresentacion = estadistica.plazoPresentacion,
                    costeProduccion = estadistica.costeProduccion,
                    beneficio = estadistica.porcentajeBeneficio,
                    precioTrabajo = estadistica.precioTrabajo,
                    totalOtrosTrabajos = estadistica.totalOtrosTrabajos,
                    precioEncargo = estadistica.precioEncargo
                });
            }

            return listadoEstadisticasExcel;
        }

        public static List<EstadisticaUsosVM> rellenarListadoUsos(tsHerramientasCACOA bd, List<bdHerramientaCACOA.db.estadisticasusos> listadoEstadisticaUsos)
        {
            List<EstadisticaUsosVM> listadoEstadisticasUsosExcel = new List<EstadisticaUsosVM>();

            foreach (estadisticasusos estadistica in listadoEstadisticaUsos)
            {
                listadoEstadisticasUsosExcel.Add(new EstadisticaUsosVM
                {
                    idSimulacion = estadistica.idSimulacionNavigation?.Descripcion,
                    superficie = estadistica.superficie,
                    uso = bd.enumeraciones.First(x=> x.idEnumeracion == estadistica.idUso).ValorAlfabetico1,
                    tipologia = bd.tipologias.First(x=> x.idtipologia == estadistica.idTipologia).Descripcion,
                    intervencion = bd.enumeraciones.First(x=> x.idEnumeracion == estadistica.idIntervencion).ValorAlfabetico1,
                });
            }

            return listadoEstadisticasUsosExcel;
        }
        public static List<EstadisticasFactoresVM> rellenarListadoFactores(tsHerramientasCACOA bd, List<bdHerramientaCACOA.db.estadisticasfactores> listadoEstadisticaFactores)
        {
            List<EstadisticasFactoresVM> listadoEstadisticaFactoresExcel = new List<EstadisticasFactoresVM>();

            foreach (estadisticasfactores estadistica in listadoEstadisticaFactores)
            {
                listadoEstadisticaFactoresExcel.Add(new EstadisticasFactoresVM
                {
                    idSimulacion = estadistica.idsimulacionNavigation?.Descripcion,
                    nombre = estadistica.nombre,
                    coeficiente =estadistica.coeficiente,
                    tipo = estadistica.tipo
                });
            }

            return listadoEstadisticaFactoresExcel;
        }

        public static List<EstadisticasUrbanVM> rellenarListadoURBAN(List<bdHerramientaCACOA.db.estadisticas> listadoEstadisticaUrban)
        {
            List<EstadisticasUrbanVM> listadoEstadisticasUrbanExcel = new List<EstadisticasUrbanVM>();

            foreach (estadisticas estadistica in listadoEstadisticaUrban)
            {
                listadoEstadisticasUrbanExcel.Add(new EstadisticasUrbanVM
                {
                    idSimulacion = estadistica.idSimulacionNavigation?.Descripcion,
                    numeroTrabajadores = estadistica.numeroTrabajadores,
                    costeAnualTotal = estadistica.totalCosteAnual,
                    horasProduccion = estadistica.horasProduccion,
                    costesDirectos = estadistica.costeDirecto,
                    costesIndirectos = estadistica.costeIndirecto,
                    costesVariables = estadistica.costeVariable,
                    costeDespacho = estadistica.costeHoraDespachoProf,
                    tipoDocumento = estadistica.tipoDocumento,
                    documento = estadistica.documento,
                    dato1 = estadistica.dato1,
                    dato2 = estadistica.dato2,
                    dato3 = estadistica.dato3,
                    porcentajeFases = estadistica.totalFases,
                    innovacion = estadistica.innovacion,
                    horasTrabajo = estadistica.horasTPE,
                    porcentajeExternalizacion = estadistica.porcentajeExternalizacion,
                    costeExternalizacion = estadistica.costeHoraExternalizacion,
                    plazoPresentacion = estadistica.plazoPresentacion,
                    costeProduccion = estadistica.costeProduccion,
                    beneficio = estadistica.porcentajeBeneficio,
                    precioTrabajo = estadistica.precioTrabajo,
                });
            }

            return listadoEstadisticasUrbanExcel;
        }


        public static double pasarHorasASemana(double horas)
        {
            double semanas = 0;
            double horasSemanales = 7 * 24;

            semanas = horas / horasSemanales; 

            return semanas;
        }


        public static byte[] GenerarExcelCasa(
            tsHerramientasCACOA bd,
    List<estadisticas> listadoHerramientaEstadistica,
    List<estadisticasusos> listadoHerramientaEstadisticaUsos,
    List<estadisticasfactores> listadoHerramientaEstadisticaFactores)
        {
            using var wb = new XLWorkbook();
            IXLWorksheet ws ;
            string tituloExcel = "Herramienta CASA";

            if (listadoHerramientaEstadisticaFactores == null)
            { 
             tituloExcel = "Licitación CASA";
                ws = wb.Worksheets.Add("Licitación CASA");
            }
            else
            {
                ws = wb.Worksheets.Add("Herramienta CASA");
            }

                var tablaPrincipal = generarTablaPrincipal(ws, listadoHerramientaEstadistica, tituloExcel);

            int filaSiguiente = tablaPrincipal.RangeAddress.LastAddress.RowNumber + 5;

            int ultimaFilaUso = generarTablaUsos(bd,ws, filaSiguiente, listadoHerramientaEstadisticaUsos);
            ultimaFilaUso += 5;

            if (listadoHerramientaEstadisticaFactores != null)
            {
                generarTablaFactores(bd, ws, ultimaFilaUso, listadoHerramientaEstadisticaFactores);
            }

            using var ms = new MemoryStream();
            wb.SaveAs(ms);
            return ms.ToArray();
        }

        private static IXLTable? generarTablaPrincipal(IXLWorksheet? ws, List<estadisticas> listadoHerramientaEstadistica, string tituloExcel)
        {
            var datos = UtilidadesCASA.rellenarListadoCASA(listadoHerramientaEstadistica);

            // INTRODUCIR DATOS PARA LA TABLA
            var table = ws.Cell("B4").InsertTable(datos);

            // OBTENER TAMAÑO DE LA TABLA
            var firstCol = table.RangeAddress.FirstAddress.ColumnNumber;
            var lastCol = table.RangeAddress.LastAddress.ColumnNumber;
            var firstRow = table.RangeAddress.FirstAddress.RowNumber;
            var lastRow = table.RangeAddress.LastAddress.RowNumber;

            // AUMENTAMOS EL TAMAÑO DEL HEADER UN POCO
            int filaHeader = table.HeadersRow().RowNumber();
            ws.Row(filaHeader).Height += 20;

            // OBTENER PRIMERA FILA DE LA TABLA PARA PONER EL TITULO ARRIBA
            int filaTabla = table.FirstRow().RowNumber();

            // PONER EL TITULO EN LA FILA DE ARRIBA
            int filaTitulo = filaTabla - 1;

            // SE ESCRIBE EL TITULO
            ws.Cell(filaTitulo, 2).Value = tituloExcel;

            // SE UNE LAS COLUMNAS
            ws.Range(filaTitulo, 2, filaTitulo, table.ColumnCount()).Merge();

            // SE LE PONE UN FORMATO
            var rangoTitulo = ws.Range(filaTitulo, 2, filaTitulo, table.ColumnCount());
            rangoTitulo.Merge();
            rangoTitulo.Style.Font.Bold = true;
            rangoTitulo.Style.Font.FontSize = 14;
            rangoTitulo.Style.Alignment.Vertical = XLAlignmentVerticalValues.Center;
            ws.Row(filaTitulo).Height = 25;


            // LE PONEMOS FORMATO AL HEADER
            var headerRange = ws.Range(filaHeader, firstCol, filaHeader, lastCol);
            headerRange.Style.Alignment.Vertical = XLAlignmentVerticalValues.Center;
            headerRange.Style.Font.Bold = true;
            headerRange.Style.Font.FontColor = XLColor.White;
            headerRange.Style.Fill.BackgroundColor = XLColor.FromHtml("#156082");

            // CENTRAR LOS DATOS
            var dataRange = ws.Range(firstRow, firstCol, lastRow, lastCol);
            dataRange.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;

            // AJUSTAMOS LA TABLA
            ws.Columns(firstCol, lastCol).AdjustToContents();

            // SE PONE EL TITULO DE LOS HEADERS
            table.Field(nameof(EstadistiaHerraCasaVM.idSimulacion)).Name = "Id Simulación";
            table.Field(nameof(EstadistiaHerraCasaVM.numeroTrabajadores)).Name = "Total trabajadores";
            table.Field(nameof(EstadistiaHerraCasaVM.costeAnualTotal)).Name = "Coste anual total";
            table.Field(nameof(EstadistiaHerraCasaVM.horasProduccion)).Name = "Horas de producción";
            table.Field(nameof(EstadistiaHerraCasaVM.costesDirectos)).Name = "Costes directos";
            table.Field(nameof(EstadistiaHerraCasaVM.costesIndirectos)).Name = "Coste indirectos";
            table.Field(nameof(EstadistiaHerraCasaVM.costesVariables)).Name = "Coste variables";
            table.Field(nameof(EstadistiaHerraCasaVM.costeDespacho)).Name = "Coste despacho";
            table.Field(nameof(EstadistiaHerraCasaVM.totalSuperficie)).Name = "Total superficie";
            table.Field(nameof(EstadistiaHerraCasaVM.porcentajeFases)).Name = "% fases";

            table.Field(nameof(EstadistiaHerraCasaVM.horasDocumentacion)).Name = "Horas documentación";
            table.Field(nameof(EstadistiaHerraCasaVM.horasDireccionObra)).Name = "Horas dirección obra";
            table.Field(nameof(EstadistiaHerraCasaVM.horasTrabajo)).Name = "Horas trabajo";
            table.Field(nameof(EstadistiaHerraCasaVM.porcentajeExternalizacion)).Name = "% external.";
            table.Field(nameof(EstadistiaHerraCasaVM.plazoPresentacion)).Name = "Plazo presentación";
            table.Field(nameof(EstadistiaHerraCasaVM.costeProduccion)).Name = "Coste de producción";
            table.Field(nameof(EstadistiaHerraCasaVM.beneficio)).Name = "Beneficio";
            table.Field(nameof(EstadistiaHerraCasaVM.precioTrabajo)).Name = "Precio trabajo";
            table.Field(nameof(EstadistiaHerraCasaVM.totalOtrosTrabajos)).Name = "Total otros trabajos";
            table.Field(nameof(EstadistiaHerraCasaVM.precioEncargo)).Name = "Precio encargo";

            return table;
        }

        private static int generarTablaUsos(tsHerramientasCACOA bd, IXLWorksheet ws, int filaValida, List<estadisticasusos> listadoHerramientaEstadisticaUsos)
        {
            var listaUsos = UtilidadesCASA.rellenarListadoUsos(bd, listadoHerramientaEstadisticaUsos);

            // SE AGRUPA POR IDSIMULACION PARA SEPARAR LOS DATOS POR SIMULACION
            var simulacion = listaUsos.GroupBy(x => x.idSimulacion);

            int fila = filaValida;

            ws.Cell(fila, 2).Value = "Id Simulación";
            ws.Cell(fila, 3).Value = "Superficie";
            ws.Cell(fila, 4).Value = "Uso";
            ws.Cell(fila, 5).Value = "Tipología";
            ws.Cell(fila, 6).Value = "Intervención";


            // SE PONE EL FORMATO DEL HEADER
            var headerRange = ws.Range(fila, 2, fila, 6);

            headerRange.Style.Fill.BackgroundColor = XLColor.FromHtml("#156082");
            headerRange.Style.Font.Bold = true;
            headerRange.Style.Font.FontColor = XLColor.White;

            headerRange.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
            headerRange.Style.Alignment.Vertical = XLAlignmentVerticalValues.Center;

            ws.Row(fila).Height += 20;



            // SE PONE EL TITULO ARRIBA DE LA TABLA
            int filaTitulo = filaValida - 1;

            ws.Cell(filaTitulo, 2).Value = "Usos";
            var rangoTitulo = ws.Range(filaTitulo, 2, filaTitulo, 6);
            rangoTitulo.Merge();
            rangoTitulo.Style.Font.Bold = true;
            rangoTitulo.Style.Font.FontSize = 14;
            rangoTitulo.Style.Alignment.Vertical = XLAlignmentVerticalValues.Center;
            ws.Row(filaTitulo).Height = 25;


            fila++;

            // SE CREA LA TABLA RECORRIENDO EL LISTADO
            foreach (var grupo in simulacion)
            {
                // SE PONE CADA COLUMNA
                foreach (var item in grupo)
                {
                    ws.Cell(fila, 2).Value = item.idSimulacion;
                    ws.Cell(fila, 3).Value = item.superficie;
                    ws.Cell(fila, 4).Value = item.uso;
                    ws.Cell(fila, 5).Value = item.tipologia;
                    ws.Cell(fila, 6).Value = item.intervencion;

                    // SE CENTRA LOS DATOS
                    ws.Range(fila, 2, fila, 6).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
                    ws.Range(fila, 2, fila, 6).Style.Alignment.Vertical = XLAlignmentVerticalValues.Center;

                    fila++;
                }

                // FILA DE TOTALES POR CADA SIMULACION
                ws.Cell(fila, 2).Value = $"Total superficie de simulación:   {grupo.Key}";

                // SE SUMA EL TOTAL DE SUPERFICIE Y SE PONE UN FORMATO
                ws.Cell(fila, 3).Value = grupo.Sum(x => x.superficie);
                ws.Range(fila, 2, fila, 6).Style.Font.Bold = true;
                ws.Range(fila, 2, fila, 6).Style.Fill.BackgroundColor = XLColor.LightGray;

                fila++;
            }

            // AJSUTAR COLUMNAS
            ws.Columns().AdjustToContents();

            return fila;
        }

        private static int generarTablaFactores(tsHerramientasCACOA bd, IXLWorksheet ws, int filaValida, List<estadisticasfactores> listadoHerramientaEstadisticaFactores)
        {
            var listaUsos = UtilidadesCASA.rellenarListadoFactores(bd, listadoHerramientaEstadisticaFactores);

            // SE AGRUPA POR EL IDSIMULACION PARA DIVIDIR POR SIMULACION
            var simulacion = listaUsos.GroupBy(x => x.idSimulacion);

            int fila = filaValida;

            ws.Cell(fila, 2).Value = "Id Simulación";
            ws.Cell(fila, 3).Value = "Nombre";
            ws.Cell(fila, 4).Value = "Coeficiente";
            ws.Cell(fila, 5).Value = "Tipo";


            // SE PONE UN FORMATO PARA EL HEADER
            var headerRange = ws.Range(fila, 2, fila, 5);

            headerRange.Style.Fill.BackgroundColor = XLColor.FromHtml("#156082");
            headerRange.Style.Font.Bold = true;
            headerRange.Style.Font.FontColor = XLColor.White;

            headerRange.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
            headerRange.Style.Alignment.Vertical = XLAlignmentVerticalValues.Center;

            ws.Row(fila).Height += 20;


            // SE PONE EL TITULO

            int filaTitulo = filaValida - 1;

            ws.Cell(filaTitulo, 2).Value = "Factores";
            var rangoTitulo = ws.Range(filaTitulo, 2, filaTitulo, 5);
            rangoTitulo.Merge();
            rangoTitulo.Style.Font.Bold = true;
            rangoTitulo.Style.Font.FontSize = 14;
            rangoTitulo.Style.Alignment.Vertical = XLAlignmentVerticalValues.Center;
            ws.Row(filaTitulo).Height = 25;

            fila++;

            // RECORREMOS EL LISTADO
            foreach (var grupo in simulacion)
            {
                // SE AGREGA LAS COLUMNAS
                foreach (var item in grupo)
                {
                    ws.Cell(fila, 2).Value = item.idSimulacion;
                    ws.Cell(fila, 3).Value = item.nombre;
                    ws.Cell(fila, 4).Value = item.coeficiente;
                    ws.Cell(fila, 5).Value = item.tipo;

                    ws.Range(fila, 2, fila, 5).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
                    ws.Range(fila, 2, fila, 5).Style.Alignment.Vertical = XLAlignmentVerticalValues.Center;

                    fila++;
                }

                // FILA TOTAL PARA DIVIDIR
                ws.Cell(fila, 2).Value = $"";
                ws.Range(fila, 2, fila, 5).Style.Font.Bold = true;
                ws.Range(fila, 2, fila, 5).Style.Fill.BackgroundColor = XLColor.LightGray;

                fila++;
            }

            // AJUSTAMOS COLUMNAS
            ws.Columns().AdjustToContents();

            return fila;
        }







        public static byte[] GenerarExcelURBAN(tsHerramientasCACOA bd, List<estadisticas> listadoUrbanEstadistica, string tipoHerramienta)
        {
            using var wb = new XLWorkbook();
            IXLWorksheet ws;
            string tituloExcel = tipoHerramienta;
            ws = wb.Worksheets.Add(tipoHerramienta);

            crearTablaURBAN( ws,listadoUrbanEstadistica, tipoHerramienta);

            using var ms = new MemoryStream();
            wb.SaveAs(ms);
            return ms.ToArray();
        }

     



        private static IXLTable? crearTablaURBAN(IXLWorksheet? ws, List<estadisticas> listadoHerramientaEstadisticaUrban, string tituloExcel)
        {
            var datos = UtilidadesCASA.rellenarListadoURBAN(listadoHerramientaEstadisticaUrban);

            // INTRODUCIR DATOS PARA LA TABLA
            var table = ws.Cell("B4").InsertTable(datos);

            // OBTENER TAMAÑO DE LA TABLA
            var firstCol = table.RangeAddress.FirstAddress.ColumnNumber;
            var lastCol = table.RangeAddress.LastAddress.ColumnNumber;
            var firstRow = table.RangeAddress.FirstAddress.RowNumber;
            var lastRow = table.RangeAddress.LastAddress.RowNumber;

            // AUMENTAMOS EL TAMAÑO DEL HEADER UN POCO
            int filaHeader = table.HeadersRow().RowNumber();
            ws.Row(filaHeader).Height += 20;

            // OBTENER PRIMERA FILA DE LA TABLA PARA PONER EL TITULO ARRIBA
            int filaTabla = table.FirstRow().RowNumber();

            // PONER EL TITULO EN LA FILA DE ARRIBA
            int filaTitulo = filaTabla - 1;

            // SE ESCRIBE EL TITULO
            ws.Cell(filaTitulo, 2).Value = tituloExcel;

            // SE UNE LAS COLUMNAS
            ws.Range(filaTitulo, 2, filaTitulo, table.ColumnCount()).Merge();

            // SE LE PONE UN FORMATO
            var rangoTitulo = ws.Range(filaTitulo, 2, filaTitulo, table.ColumnCount());
            rangoTitulo.Merge();
            rangoTitulo.Style.Font.Bold = true;
            rangoTitulo.Style.Font.FontSize = 14;
            rangoTitulo.Style.Alignment.Vertical = XLAlignmentVerticalValues.Center;
            ws.Row(filaTitulo).Height = 25;


            // LE PONEMOS FORMATO AL HEADER
            var headerRange = ws.Range(filaHeader, firstCol, filaHeader, lastCol);
            headerRange.Style.Alignment.Vertical = XLAlignmentVerticalValues.Center;
            headerRange.Style.Font.Bold = true;
            headerRange.Style.Font.FontColor = XLColor.White;
            headerRange.Style.Fill.BackgroundColor = XLColor.FromHtml("#156082");

            // CENTRAR LOS DATOS
            var dataRange = ws.Range(firstRow, firstCol, lastRow, lastCol);
            dataRange.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;

            // AJUSTAMOS LA TABLA
            ws.Columns(firstCol, lastCol).AdjustToContents();

            // SE PONE EL NOMBRE AL HEADER
            table.Field(nameof(EstadisticasUrbanVM.idSimulacion)).Name = "Id Simulación";
            table.Field(nameof(EstadisticasUrbanVM.numeroTrabajadores)).Name = "Total trabajadores";
            table.Field(nameof(EstadisticasUrbanVM.costeAnualTotal)).Name = "Coste anual total";
            table.Field(nameof(EstadisticasUrbanVM.horasProduccion)).Name = "Horas de producción";
            table.Field(nameof(EstadisticasUrbanVM.costesDirectos)).Name = "Costes directos";
            table.Field(nameof(EstadisticasUrbanVM.costesIndirectos)).Name = "Coste indirectos";
            table.Field(nameof(EstadisticasUrbanVM.costesVariables)).Name = "Coste variables";
            table.Field(nameof(EstadisticasUrbanVM.costeDespacho)).Name = "Coste despacho";
            table.Field(nameof(EstadisticasUrbanVM.tipoDocumento)).Name = "Tipo de documento";
            table.Field(nameof(EstadisticasUrbanVM.documento)).Name = "Documento";
            table.Field(nameof(EstadisticasUrbanVM.dato1)).Name = "Dato 1";
            table.Field(nameof(EstadisticasUrbanVM.dato2)).Name = "Dato 2";
            table.Field(nameof(EstadisticasUrbanVM.dato3)).Name = "Dato 3";
            table.Field(nameof(EstadisticasUrbanVM.porcentajeFases)).Name = "Fases";
            table.Field(nameof(EstadisticasUrbanVM.innovacion)).Name = "Innovación";
            table.Field(nameof(EstadisticasUrbanVM.horasTrabajo)).Name = "Horas trabajo";
            table.Field(nameof(EstadisticasUrbanVM.porcentajeExternalizacion)).Name = "% external.";
            table.Field(nameof(EstadisticasUrbanVM.costeExternalizacion)).Name = "Coste externalización";
            table.Field(nameof(EstadisticasUrbanVM.plazoPresentacion)).Name = "Plazo presentación";
            table.Field(nameof(EstadisticasUrbanVM.costeProduccion)).Name = "Coste de producción";
            table.Field(nameof(EstadisticasUrbanVM.beneficio)).Name = "Beneficio";
            table.Field(nameof(EstadisticasUrbanVM.precioTrabajo)).Name = "Precio trabajo";

            return table;
        }

    }
}
