using bdHerramientaCACOA;
using bdHerramientaCACOA.db;
using bdHerramientaCACOA.dbcontext;
using BlazorBootstrap;
using HerramientaCASA.Model;
using HerramientaCASA.ViewModel;
using System.Text;
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.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 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 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
        }
    }
}
