using bdAntifraude.dbcontext;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace bdAntifraude.vistas
{
public class VePersonas
{
    public int IdPersona { get; set; }
    public string NIF { get; set; }
    public string Nombre { get; set; }
    public string Apellidos { get; set; }
    public string ApellidosNombre { get; set; }
    public string CorreoElectronico { get; set; }
    public string? departamento { get; set; }
    public int? Externo { get; set; }
    public string NRP { get; set; }
    public string NumeroAfiliacionMutua { get; set; }
    public DateTime? FechaNacimiento { get; set; }
    public string Domicilio { get; set; }
    public string CodigoPostal { get; set; }
    public string Telefono { get; set; }
    public DateTime? FechaAltaPAR { get; set; }
    public DateTime? FechaBajaPAR { get; set; }
    public DateTime? FechaPosibleJubilacion { get; set; }
    public DateTime? FechaConsolidacionGrado { get; set; }
    public DateTime? FechaCumplimientoProximoTrienio { get; set; }
    public string Cuerpo { get; set; }
    public string LiteralSituacion { get; set; }
    public string AdscripcionRPT { get; set; }
    public int? TotalTrienios { get; set; }
    public DateTime? FechaComplementoCarrera { get; set; }
    public string CausaBaja { get; set; }
    public string Sexo { get; set; }
    public string NombreMunicipio { get; set; }
    public string NombreProvincia { get; set; }
    public string Nivel { get; set; }
    public string NivelPuestoActual { get; set; }
    public string PuestoActual { get; set; }
    public string DepartamentoActual { get; set; }
    public string CargoOcupadoActual { get; set; }
    public string TramoComplementoCarrera { get; set; }
    public int? IdSituacion { get; set; }
    public string GradoConsolidado { get; set; }
    public string LinkNif { get; set; }
    public string servicioAdscrito { get; set; }

    public static List<VePersonas> ObtenerVistaPersonas(tsGestionAntifraude bd, bool activos)
    {
        try
        {


            var comps = bd.COMPLEMENTOSCARRERA
                .Where(x => x.IDPERSONA.HasValue)
                .GroupBy(x => x.IDPERSONA).ToList()
                .Select(x => x.OrderByDescending(y => y.FECHAINICIO).FirstOrDefault())
                .Select(x => new { idPersona = x.IDPERSONA, FechaUltimoComplemento = x.FECHAINICIO, UltimoTramo =  x.IDTRAMONavigation.DESCRIPCION })
                .ToList();

            var puest = bd.PUESTOS
                .Where(x => x.IDRPTNavigation.IDSITUACIONNavigation.DESCRIPCION == "ACTIVA")
                .Select(x => new { idPersona = x.IDPERSONAL, PuestoActual = x.IDRPTDESNavigation.DENOMINACION, DepartamentoActual = x.IDRPTDESNavigation.IDUNIDADADMINISTRATIVANavigation.LITERAL_DEPARTAMENTO, NivelPuestoActual = x.IDRPTDESNavigation.IDNIVEL_RPTNavigation.NIVEL1, CargoOcupadoActual = x.IDOCUPACIONNavigation.DESCRIPCION })
                .ToList();

            var trie = bd.TRIENIOS
                .Where(x => x.IDPERSONAL.HasValue)               
                .GroupBy(x => x.IDPERSONAL).ToList()
                .Select(x => new { idPersonal = x.First().IDPERSONAL, Trienios = x.Sum(y => (y.TC.HasValue ? y.TC.Value : 0) + (y.TOA.HasValue ? y.TOA.Value : 0)) })
                .ToList();

            var iDAltoCargo = bd.ENUMERACIONES.First(x => x.CODIGO == "TIPPER.ALTOCARGO").IDENUMERACION;
            var iDDipAsig = bd.ENUMERACIONES.First(x => x.CODIGO == "TIPPER.DIPASIG").IDENUMERACION;
            var iDTPaltoCargo= bd.TIPOS_PERSONAL.First(x => x.TIPO_PERSONAL == "A").IDTIPO;

                var perstmp = (from x in bd.PERSONAS
                           where x.IDTIPO != iDAltoCargo && x.IDTIPO != iDDipAsig || x.IDADSCRIPCIONRPT!= iDTPaltoCargo
                               select new
                           {
                               IdPersona = x.IDPERSONA,
                               NIF = x.NIF,
                               Nombre = x.NOMBRE,
                               Apellidos = x.APELLIDOS,
                               CorreoElectronico = x.CORREOELECTRONICO,
                               departamento = x.IDDEPARTAMENTONavigation.DESCRIPCION,
                               Externo = x.EXTERNO,
                               NRP = x.NRP,
                               NumeroAfiliacionMutua = x.NUMEROAFILIACIONMUTUA,
                               FechaNacimiento = x.FECHANACIMIENTO,
                               Domicilio = x.DOMICILIO,
                               CodigoPostal = x.CODIGOPOSTAL,
                               Telefono = x.TELEFONO1,
                               FechaAltaPAR = x.FECHAALTAPAR,
                               FechaBajaPAR = x.FECHABAJAPAR,
                               FechaPosibleJubilacion = x.FECHAPOSIBLEJUBILACION,
                               FechaConsolidacionGrado = x.FECHACONSOLIDACIONGRADO,
                               FechaCumplimientoProximoTrienio = x.FECHACUMPLIMIENTOPROXTRIENIO,
                               Cuerpo = x.IDCUERPORPT.HasValue ? x.IDCUERPORPTNavigation.DESCRIPCION : "",
                               AdscripcionRPT = x.IDADSCRIPCIONRPT.HasValue ? x.IDTIPONavigation.DESCRIPCION : "",
                               CausaBaja = x.IDCAUSADEBAJA.HasValue ? x.IDCAUSADEBAJANavigation.DESCRIPCION : "",
                               Sexo = x.IDSEXO.HasValue ? x.IDSEXONavigation.DESCRIPCION : "",
                               CodigoMunicipio = x.CODIGOMUNICIPIO,
                               NombreMunicipio = x.CODIGOMUNICIPIO != null ? x.CODIGOMUNICIPIONavigation.NOMBRE : "",
                               NombreProvincia = x.CODIGOMUNICIPIO != null ? x.CODIGOMUNICIPIONavigation.CODIGOPROVINCIANavigation.NOMBRE : "",
                               Nivel = x.NIVEL,
                               LiteralSituacion = x.IDSITUACIONADMINISTRATIVARPT != null ? x.IDSITUACIONADMINISTRATIVARPTNavigation.LITERAL_SITUACION : "",
                               idSituacion = x.IDSITUACIONADMINISTRATIVARPT,
                               GrConsolidado = x.IDGRADOPERSONALCONSOLIDADO != null ? x.IDNIVELRPTNavigation.NIVEL1 : ""                              
                           }).ToList();

                var pers = (from x in perstmp
                            join cc in comps on x.IdPersona equals cc.idPersona into gcc
                            from cc in gcc.DefaultIfEmpty()
                            join ps in puest on x.IdPersona equals ps.idPersona into gps
                            from ps in gps.DefaultIfEmpty()
                            join tri in trie on x.IdPersona equals tri.idPersonal into gtrie
                            from tri in gtrie.DefaultIfEmpty()
                            select new VePersonas
                            {
                                IdPersona = x.IdPersona,
                                NIF = x.NIF,
                                Nombre = x.Nombre,
                                Apellidos = x.Apellidos,
                                ApellidosNombre = x.Nombre + " " + x.Apellidos,
                                CorreoElectronico = x.CorreoElectronico,
                                departamento = x.departamento,
                                Externo = x.Externo,
                                NRP = x.NRP,
                                NumeroAfiliacionMutua = x.NumeroAfiliacionMutua,
                                FechaNacimiento = x.FechaNacimiento,
                                Domicilio = x.Domicilio,
                                CodigoPostal = x.CodigoPostal,
                                Telefono = x.Telefono,
                                FechaAltaPAR = x.FechaAltaPAR,
                                FechaBajaPAR = x.FechaBajaPAR,
                                FechaPosibleJubilacion = x.FechaPosibleJubilacion,
                                FechaConsolidacionGrado = x.FechaConsolidacionGrado,
                                FechaCumplimientoProximoTrienio = x.FechaCumplimientoProximoTrienio,
                                Cuerpo = x.Cuerpo,
                                AdscripcionRPT = x.AdscripcionRPT,
                                TotalTrienios = tri == null ? 0 : tri.Trienios,
                                CausaBaja = x.CausaBaja,
                                Sexo = x.Sexo,
                                NombreMunicipio = x.NombreMunicipio,
                                NombreProvincia = x.NombreProvincia,
                                Nivel = x.Nivel,
                                FechaComplementoCarrera = cc == null ? (DateTime?)null : cc.FechaUltimoComplemento,
                                TramoComplementoCarrera = cc == null ? "" : cc.UltimoTramo,
                                NivelPuestoActual = ps == null ? "" : ps.NivelPuestoActual,
                                CargoOcupadoActual = ps == null ? "" : ps.CargoOcupadoActual,
                                DepartamentoActual = ps == null ? "" : ps.DepartamentoActual,
                                PuestoActual = ps == null ? "" : ps.PuestoActual,
                                LiteralSituacion = x.LiteralSituacion,
                                IdSituacion = x.idSituacion,
                                GradoConsolidado = x.GrConsolidado,
                                LinkNif = bdAntifraude.db.PERSONAS.ObtieneNifLink(x.NIF)
                            }); ;

            if (activos)
            {
                int idsituacion = bd.SITUACION.First(x => x.CLAVE_SITUACION == "AC").IDSITUACION;
                pers = pers.Where(x => x.IdSituacion.HasValue && x.IdSituacion == idsituacion);
            }

            return pers.ToList();
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message, ex);
        }
    }
}

}
