using bdAntifraude.clases;
using bdAntifraude.db;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Query.Internal;
using Microsoft.VisualBasic;
using System;
using System.Collections.Generic;
using System.Diagnostics.Eventing.Reader;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Net.WebRequestMethods;
using static System.Runtime.InteropServices.JavaScript.JSType;
using tsUtilidades;
using Renci.SshNet;
using bdAntifraude;



using tsUtilidades.Enumeraciones;
using System.Diagnostics;
using System.Security.Cryptography;
using tsl5;
using Castle.Components.DictionaryAdapter.Xml;

namespace bdAntifraude
{
    public enum NivelLogs
    {
        SIN_LOGS,
        TODOS_LOGS,
        MODIFICACIONES_Y_ELIMINACIONES

    }
    public class Utilidades
    {


        public static tsl5.Datos.BBDD ObtieneCBD(string Base = "")
        {
            var bbdd = new tsl5.Datos.BBDD
            {
                Pooling = true
            };

            string sBaseDatos = string.IsNullOrEmpty(Base) ?
                (Environment.GetCommandLineArgs().Length > 1 ? Environment.GetCommandLineArgs()[1] : "")
                : Base;

            switch (sBaseDatos.ToLower())
            {
                case "desarrollo":
                case "preproduccion":
                    bbdd.DataBase = "XE";
                    bbdd.Password = "mnJ1FkFTe-TpH5"; // antifraude2022
                    bbdd.Usuario = "ANTIFRAUDEDESARROLLO";
                    bbdd.Tipo = tsl5.Enumeraciones.TipoBD.ORACLE;
                    bbdd.Servidor = "192.168.41.203";
                    bbdd.Puerto = 21521;
                    return bbdd;

                case "historicotecnosis":
                    bbdd.DataBase = "XE";
                    bbdd.Password = "mnJ1FkFTe-TpH5"; // antifraude2022
                    bbdd.Usuario = "ANTIFRAUDEDESARROLLO";
                    bbdd.Tipo = tsl5.Enumeraciones.TipoBD.ORACLE;
                    bbdd.Servidor = "192.168.41.203";
                    bbdd.Puerto = 21521;
                    return bbdd;

                case "pruebas":
                case "ayer":
                case "historico":
                    bbdd.DataBase = "pre03";
                    switch (sBaseDatos.ToLower())
                    {
                        case "pruebas":
                            bbdd.Password = "s0E:NhbqZjMC"; // tecnosis2016
                            bbdd.Usuario = "PERSONPRE_OWN";
                            break;
                        case "ayer":
                            bbdd.Password = "antesdeayer+1";
                            bbdd.Usuario = "PERSONAYER_OWN";
                            break;
                        case "historico":
                            bbdd.Password = "8.7Z3XdT\\gBh"; // tecnosis1992
                            bbdd.Usuario = "PERSON_HISTORICO";
                            break;
                    }
                    bbdd.Tipo = tsl5.Enumeraciones.TipoBD.ORACLE;
                    bbdd.Servidor = "preora02";
                    bbdd.Puerto = 1521;
                    return bbdd;

                default:
                    bbdd.DataBase = "XE";
                    bbdd.Password = "mnJ1FkFTe-TpH5"; // antifraude2022
                    bbdd.Usuario = "ANTIFRAUDE";
                    bbdd.Tipo = tsl5.Enumeraciones.TipoBD.ORACLE;
                    bbdd.Servidor = "192.168.41.203";
                    bbdd.Puerto = 21521;
                    return bbdd;
            }
        }

    //    public static OAEntities NuevaConexion(
    //tsl5.Datos.BBDD bd,
    //NivelLogs nivelLog = NivelLogs.MODIFICACIONES_Y_ELIMINACIONES,
    //string aplicacion = "",
    //string campoTimeStamp = "")
    //    {
    //        OAEntities de = new OAEntities();

    //        try
    //        {
    //            de = Conectar(
    //                bd.Servidor,
    //                bd.DataBase,
    //                bd.Usuario,
    //                bd.Password,
    //                bd.Puerto,
    //                nivelLog,
    //                aplicacion,
    //                bd.Pooling,
    //                bd.SSL,
    //                bd.FicheroCertificado,
    //                bd.PasswordCertificado
    //            );

    //            //                ((IObjectContextAdapter)de)
    //            //.ObjectContext
    //            //.CommandTimeout = 600;

    //            de.Database.SetCommandTimeout(600);
    //            de.Aplicacion = aplicacion;
    //            de.NivelLog = nivelLog;
    //            return de;
    //        }
    //        catch (Exception ex)
    //        {
    //            throw new Exception(
    //                $"No se ha podido conectar a Servidor: {bd.Servidor} Database: {bd.DataBase} Usuario: {bd.Usuario} Puerto: {bd.Puerto}\n{ex.Message}",
    //                ex
    //            );
    //        }
    //    }


        //public static OAEntities Conectar(string Servidor, string Database, string Usuario, string Password, int Puerto, NivelLogs NivelLog, string Aplicacion, bool Pooling, bool SSL, string FicheroCertificado, string ContraseñaCertificado)
        //{
        //    string[] args = Environment.GetCommandLineArgs();
        //    // If (args.Length > 1 AndAlso (args(1) = "desarrollo")) Then
        //    // NivelLog = NivelLogs.SIN_LOGS
        //    // End If
        //    OAEntities de = new OAEntities();
        //    if (Usuario == "PERSONAYER_OWN")
        //    {
        //        de = tsl5.bbdd.ObtieneEntityConnectionStringOraclePasswordClara(Servidor, Database, Puerto.ToString(), Usuario, Password, "bdOficinaAntifraude", Pooling, SSL, FicheroCertificado, ContraseñaCertificado);
        //    }
        //    else
        //    {
        //        de = tsl5.bbdd.ObtieneEntityConnectionStringOracle(Servidor, Database, Puerto.ToString(), Usuario, Password, "bdOA", Pooling, SSL, FicheroCertificado, ContraseñaCertificado);
        //    }
        //    if (!(NivelLog == NivelLogs.SIN_LOGS))
        //        de.SavingChanges += GuardandoCambios;
        //    return de;
        //}

    //    public static OAEntities Conectar(
    //    string servidor,
    //    string database,
    //    string usuario,
    //    string password,
    //    int puerto,
    //    NivelLogs nivelLog,
    //    string aplicacion,
    //    bool pooling,
    //    bool ssl,
    //    string ficheroCertificado,
    //    string contraseñaCertificado
    //)
    //    {

    //        string connectionString;
    //        if (usuario == "PERSONAYER_OWN")
    //        {
    //            connectionString = tsl5.bbdd.ObtieneEntityConnectionStringOraclePasswordClara(
    //                servidor, database, puerto, usuario, password,
    //                "bdOficinaAntifraude", pooling, ssl, ficheroCertificado, contraseñaCertificado
    //            );
    //        }
    //        else
    //        {
    //            connectionString = tsl5.bbdd.ObtieneEntityConnectionStringOracle(
    //                servidor, database, puerto, usuario, password,
    //                "bdOA", pooling, ssl, ficheroCertificado, contraseñaCertificado
    //            );
    //        }


    //        var optionsBuilder = new DbContextOptionsBuilder<OAEntities>();
    //        optionsBuilder.UseOracle(connectionString);


    //        var de = new OAEntities(optionsBuilder.Options);


    //        if (nivelLog != NivelLogs.SIN_LOGS)
    //            de.SavingChanges += GuardandoCambios;

    //        return de;
    //    }






        public static List<PuestoPersona> ObtienePuestoPersona(bdAntifraude.dbcontext.gestionantifraudeContext bd, int idPersona)
        {
            List<TIPOS_PERSONAL> listaTP = bd.TIPOS_PERSONAL.ToList();

            List<PuestoPersona> puestosnuevos = new List<PuestoPersona>();
            try
            {

                List<VIDA_ADMINISTRATIVA> listaVA = bd.VIDA_ADMINISTRATIVA.Where(x => x.IDPERSONAL == idPersona && x.IDMOTIVO != null)
                    .Include(v => v.IDMOTIVONavigation)
                    .ThenInclude(r => r.IDTIPOAPTOSNavigation)
                    .Include(v => v.NIVEL_OLDNavigation)
                    .Include(v => v.NIVELCNavigation)
                    .Include(v => v.GRUPOTNavigation)
                    .Include(v => v.OCUPACION_OLDNavigation)
                    .Include(v => v.IDPERSONALNavigation)
                    .Include(v => v.IDPUESTONavigation)
                    .ThenInclude(i => i.IDRPTDESNavigation)
                    .ThenInclude(r => r.IDDEPARTAMENTONavigation)
                    .Include(i => i.GRUPOTNavigation)
                    .Include(v => v.IDPUESTONavigation)
                                               .ThenInclude(n => n.IDRPTDESNavigation)
                                               .ThenInclude(gr => gr.GRUPO1Navigation)
                                               .Include(v => v.IDPUESTONavigation)
                                               .ThenInclude(n => n.IDRPTDESNavigation)
                                               .ThenInclude(grr => grr.GRUPO2Navigation)
                                                .Include(v => v.IDPUESTONavigation)
                                               .ThenInclude(n => n.IDRPTDESNavigation)
                                               .ThenInclude(nv => nv.IDNIVEL_RPTNavigation)
                    .OrderBy(x => x.FECHA).ThenBy(x => x.NUM_REG)
                    .AsNoTracking().ToList();
                //.Include(v => v.IDSERVICIOADSCRITONavigation)
                //.Include(v => v.IDUNIDADADMINISTRATIVANavigation)
                if (listaVA.Count > 0)
                {

                    List<VIDA_ADMINISTRATIVA> ToPoyCese = listaVA
                        .Where(x => x.MotivoTipo.Contains("TOMA POSESIÓN") ||
                        x.MotivoTipo.Contains("TOMA POSESION") ||
                        x.MotivoTipo.Contains("CESE") ||
                        x.MotivoTipo.Contains("BAJA")).ToList();

                    if (ToPoyCese.Count > 0)
                    {
                        int NumActo = ToPoyCese.Count;
                        for (int np = 0, loopTo = NumActo - 1; np <= loopTo; np += 2)
                        {
                            PuestoPersona pues = new PuestoPersona();
                            puestosnuevos.Add(pues);

                            VIDA_ADMINISTRATIVA vidaAdmin = ToPoyCese[np];
                            if (vidaAdmin?.IDMOTIVONavigation?.DESCRIPCION == "ACTIVO")
                            {
                                np = np + 1;
                                vidaAdmin = ToPoyCese[np];
                            }
                            //pues.Puesto = vidaAdmin.DENOMINACION_OLD;
                            pues.Puesto = vidaAdmin.IDPUESTONavigation.DESPUESCOM;
                            if (vidaAdmin?.IDPUESTO != null)
                            {
                                pues.Puesto = pues.Puesto + "*";
                            }
                            //pues.Nivel = vidaAdmin.DescripcionNivel;
                            pues.Nivel = vidaAdmin.IDPUESTONavigation.IDRPTDESNavigation.IDNIVEL_RPTNavigation.NIVEL1;
                            pues.Adscripcion = vidaAdmin.DescripcionAdscripcion(listaTP);
                            //pues.servicioAdscrito = vidaAdmin.IDSERVICIOADSCRITO != null ? bd.SERVICIOS.First(x => x.IDSERVICIO == vidaAdmin.IDSERVICIOADSCRITONavigation.IDSERVICIO).DESCRIPCION : "";
                            //pues.unidadAdministrativa = vidaAdmin.IDUNIDADADMINISTRATIVA != null ? bd.UNIDADADMINISTRATIVA.First(y => y.IDUNIDADADMINISTRATIVA == vidaAdmin.IDUNIDADADMINISTRATIVANavigation.IDUNIDADADMINISTRATIVA).LITERAL_DEPARTAMENTO : "";
                            pues.Grupo = vidaAdmin.IDPUESTONavigation.IDRPTDESNavigation.GRUPO1Navigation?.GRUPO1;        //vidaAdmin.DescripcionGrupo1;
                            if (vidaAdmin.IDPUESTONavigation.IDRPTDESNavigation.GRUPO2Navigation?.GRUPO1 != null)
                            {
                                pues.Grupo = pues.Grupo.Trim() + "/" + vidaAdmin.IDPUESTONavigation.IDRPTDESNavigation.GRUPO2Navigation.GRUPO1;
                            }
                            if (pues.Grupo.Trim() == "")
                            {
                                pues.Grupo = vidaAdmin.GRUPOTNavigation.GRUPO1;
                            }
                            if (pues.Adscripcion.Trim() == "")
                            {
                                if ("|I|II|III|IV|V|".Trim().Contains("|" + pues.Grupo.Trim() + "|"))
                                {
                                    pues.Adscripcion = "Laboral temporal";
                                }
                                else
                                {
                                    pues.Adscripcion = "Funcionario";
                                }
                            }
                            if (vidaAdmin.FECHA.HasValue)
                            {
                                pues.FechaToPo = (DateTime)vidaAdmin.FECHA;
                            }
                            pues.MotivoToPo = vidaAdmin.IDMOTIVONavigation.DESCRIPCION;
                            if (vidaAdmin.OCUPACION_OLD != null)
                            {
                                pues.CaracterOcu = vidaAdmin.OCUPACION_OLDNavigation.DESCRIPCION;
                            }

                            Anos_Meses_Dias TiemSer = new Anos_Meses_Dias();
                            if (np + 2 <= NumActo)
                            {
                                VIDA_ADMINISTRATIVA vidaAdmin2 = ToPoyCese[np + 1];
                                if (!vidaAdmin2.IDMOTIVONavigation.TIPMOT.Trim().Contains("CESE") && vidaAdmin2.IDMOTIVONavigation.TIPMOT.Trim().Contains("BAJA"))
                                {
                                    if (vidaAdmin2.FECHA > vidaAdmin.FECHA)
                                    {
                                        string motDes = vidaAdmin2.IDMOTIVONavigation.DESCRIPCION;
                                        if (motDes == "ACTIVO" || motDes == "NOMBRAMIENTO" || motDes.Contains("REINGRESO PLAZA") || motDes.Contains("SERVICIOS ESPECIALES") || motDes.Contains("EXCEDENCIA"))
                                        {
                                            pues.FechaCese = (DateTime)vidaAdmin2.FECHA;
                                            pues.MotivoCese = vidaAdmin2.IDMOTIVONavigation.DESCRIPCION;

                                            if (motDes.Contains("REINGRESO PLAZA") || motDes.Contains("ACTIVO") || motDes.Contains("SERVICIOS ESPECIALES"))
                                            {
                                                for (int npn = np - 1; npn >= 0; npn -= 1)
                                                {
                                                    if (ToPoyCese[npn].IDMOTIVONavigation.DESCRIPCION != "SERVICIOS ESPECIALES")
                                                    {
                                                        pues.MotivoCese = ToPoyCese[npn].IDMOTIVONavigation.DESCRIPCION;
                                                        pues.Puesto = "********";
                                                        pues.Nivel = "***";
                                                        pues.Grupo = "***";
                                                        pues.Adscripcion = "***";
                                                        if ((npn + 2) <= (NumActo - 1) && ToPoyCese[npn + 2].FECHA == pues.FechaCese)
                                                        {
                                                            pues.FechaCese = pues.FechaCese.AddDays(-1);
                                                        }
                                                        npn = 0;
                                                        PuestoPersona ppll = puestosnuevos[puestosnuevos.Count - 2];
                                                        if (ppll.FechaCese == pues.FechaToPo && ppll.MotivoCese != "CAMBIO DE SITUACIÓN ADMINISTRATIVA (CON RESERVA DE PUESTO)" && ppll.MotivoCese != "SERVICIOS ESPECIALES")
                                                        {
                                                            pues.FechaToPo = pues.FechaToPo.AddDays(+1);
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                        else
                                        {
                                            pues.FechaCese = vidaAdmin2.FECHA.Value.AddDays(-1);
                                            pues.MotivoCese = "SUPUESTO CESE NO EXISTE EN VIDAADMINISTRATIVA";
                                        }


                                    }
                                    else
                                    {
                                        if (vidaAdmin2.FECHA.HasValue)
                                        {
                                            pues.FechaCese = vidaAdmin2.FECHA.Value;
                                        }
                                        pues.MotivoCese = vidaAdmin2.IDMOTIVONavigation?.DESCRIPCION;
                                    }
                                    PuestoPersona ppl = puestosnuevos[puestosnuevos.Count - 2];
                                    if (puestosnuevos.Count - 2 >= 0 && ppl.FechaCese == pues.FechaToPo)
                                    {
                                        if (pues.MotivoToPo == "SERVICIOS ESPECIALES" && !(ppl.FechaCese == pues.FechaToPo && ppl.FechaToPo == pues.FechaToPo))
                                        {
                                            pues.FechaToPo = pues.FechaToPo.AddDays(+1);
                                            pues.Puesto = "********";
                                            pues.Nivel = "***";
                                            pues.Grupo = "***";
                                            pues.Adscripcion = "***";
                                        }
                                    }

                                    TiemSer = AnosMesesDias(pues.FechaToPo, pues.FechaCese);
                                    pues.AnosSer = TiemSer.Anos;
                                    pues.MesesSer = TiemSer.Meses;
                                    pues.DiasSer = TiemSer.Dias;
                                }
                                else
                                {
                                    pues.FechaCese = (DateTime)vidaAdmin2.FECHA;
                                    pues.MotivoCese = vidaAdmin2.IDMOTIVONavigation.DESCRIPCION;
                                    if (pues.FechaToPo == pues.FechaCese && pues.MotivoCese.Contains("COMISIÓN DE SERVICIOS") && np + 2 <= NumActo)
                                    {
                                        pues.MotivoToPo = vidaAdmin2.IDMOTIVONavigation.DESCRIPCION;
                                        pues.MotivoCese = ToPoyCese[np + 2].IDMOTIVONavigation.DESCRIPCION;
                                        pues.FechaCese = ToPoyCese[np + 2].FECHA.Value.AddDays(-1);
                                        pues.Puesto = "********";
                                        pues.Nivel = "***";
                                        pues.Grupo = "***";
                                        pues.Adscripcion = "***";
                                    }
                                    if (((np + 2) < (NumActo - 1)) && pues.FechaCese == ToPoyCese[np + 2].FECHA && pues.FechaToPo != pues.FechaCese && ToPoyCese[np + 2].IDMOTIVONavigation.DESCRIPCION != "SERVICIOS ESPECIALES")
                                    {
                                        pues.FechaCese = pues.FechaCese.AddDays(-1);
                                    }
                                    if (puestosnuevos.Count >= 2 && pues.FechaToPo == puestosnuevos[puestosnuevos.Count - 2].FechaCese)
                                    {
                                        var puestoant = puestosnuevos[puestosnuevos.Count - 2];
                                        if (pues.MotivoToPo == "NOMBRAMIENTO")
                                        {
                                            puestoant.FechaCese = puestoant.FechaCese.AddDays(-1);
                                            TiemSer = AnosMesesDias(puestoant.FechaToPo, puestoant.FechaCese);
                                            puestoant.AnosSer = TiemSer.Anos;
                                            puestoant.MesesSer = TiemSer.Meses;
                                            puestoant.DiasSer = TiemSer.Dias;
                                        }
                                        if (pues.MotivoToPo == "SERVICIOS ESPECIALES")
                                        {
                                            pues.FechaToPo = pues.FechaToPo.AddDays(1);
                                        }
                                    }
                                    TiemSer = AnosMesesDias(pues.FechaToPo, pues.FechaCese);
                                    pues.AnosSer = TiemSer.Anos;
                                    pues.MesesSer = TiemSer.Meses;
                                    pues.DiasSer = TiemSer.Dias;
                                    if (pues.MotivoToPo == "SERVICIOS ESPECIALES" && (pues.MotivoCese == "REVOCACIÓN O CESE" || pues.MotivoCese == "CAMBIO DE SITUACIÓN ADMINISTRATIVA (CON RESERVA DE PUESTO)"))
                                    {
                                        pues.Puesto = "********";
                                        pues.Nivel = "***";
                                        pues.Grupo = "***";
                                        pues.Adscripcion = "***";
                                    }
                                }
                            }
                            else
                            {
                                TiemSer = AnosMesesDias(pues.FechaToPo, DateTime.Now);
                                pues.AnosSer = TiemSer.Anos;
                                pues.MesesSer = TiemSer.Meses;
                                pues.DiasSer = TiemSer.Dias;
                                if (pues.MotivoToPo.Contains("SERVICIOS ESPECIALES") && pues.MotivoCese == null)
                                {
                                    pues.Puesto = "********";
                                    pues.Nivel = "***";
                                    pues.Grupo = "***";
                                    pues.Adscripcion = "***";
                                }
                                np = NumActo;
                            }

                            if ((np + 2) <= (NumActo - 1) && ToPoyCese[np + 2].FECHA.Value.Subtract(pues.FechaCese).Days > 1 && ToPoyCese[np + 2].IDMOTIVONavigation.DESCRIPCION == "SERVICIOS ESPECIALES")
                            {
                                var puesnue = new PuestoPersona();
                                puestosnuevos.Add(puesnue);
                                puesnue.MotivoToPo = pues.MotivoCese;
                                puesnue.MotivoCese = pues.MotivoCese;
                                puesnue.FechaToPo = pues.FechaCese.AddDays(1);
                                puesnue.FechaCese = ToPoyCese[np + 2].FECHA.Value.AddDays(-1);
                                puesnue.Puesto = "********";
                                puesnue.Nivel = "***";
                                puesnue.Grupo = "***";
                                puesnue.Adscripcion = "***";
                                TiemSer = AnosMesesDias(puesnue.FechaToPo, puesnue.FechaCese);
                                puesnue.AnosSer = TiemSer.Anos;
                                puesnue.MesesSer = TiemSer.Meses;
                                puesnue.DiasSer = TiemSer.Dias;
                            }
                            if ((np + 2) <= (NumActo - 1) && ToPoyCese[np + 2].FECHA == pues.FechaCese && ToPoyCese[np + 2].IDMOTIVONavigation.DESCRIPCION != "SERVICIOS ESPECIALES" && ToPoyCese[np + 2].IDMOTIVONavigation.DESCRIPCION != "ACTIVO" && pues.FechaToPo != pues.FechaCese)
                            {
                                pues.FechaCese = pues.FechaCese.AddDays(-1);
                                TiemSer = AnosMesesDias(pues.FechaToPo, pues.FechaCese);
                                pues.AnosSer = TiemSer.Anos;
                                pues.MesesSer = TiemSer.Meses;
                                pues.DiasSer = TiemSer.Dias;
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                var a = 1;
            }
            return puestosnuevos.OrderByDescending(x => x.FechaToPo).ToList();
        }

        public static Anos_Meses_Dias AnosMesesDias(DateTime fechaInicio, DateTime fechaFin)
        {
            //DateTime fechaFinAjustada = (fechaFin.Date == DateTime.Today)
            //                              ? fechaFin.AddDays(1)
            //                              : fechaFin;

            if (fechaFin < fechaInicio)
                throw new ArgumentException("La fecha final debe ser mayor o igual que la fecha de inicio.");

            int anos = fechaFin.Year - fechaInicio.Year;
            int meses = fechaFin.Month - fechaInicio.Month;
            int dias = fechaFin.Day - fechaInicio.Day;

            // Ajustar cuando la diferencia en días es negativa (no se completó el mes)
            if (dias < 0)
            {
                meses--;
                int diasMesAnterior = DateTime.DaysInMonth(
                    fechaFin.Month == 1 ? fechaFin.Year - 1 : fechaFin.Year,
                    fechaFin.Month == 1 ? 12 : fechaFin.Month - 1);
                dias += diasMesAnterior;
            }

            // Ajustar cuando la diferencia en meses es negativa (no se completó el año)
            if (meses < 0)
            {
                anos--;
                meses += 12;
            }

            return new Anos_Meses_Dias { Anos = anos, Meses = meses, Dias = dias };
        }
    }
}
