using bdAntifraude.db;
using Microsoft.VisualBasic;
using System.Diagnostics;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using bdAntifraude.dbcontext;

namespace bdAntifraude
{
    public class Comun
    {

        internal static string CadenaConexionBD = "";
        internal static string CadenaConexionBD_SL = "";
        public static string? Usuario;
        public static bool? EsRemoto = default(Boolean?);
        public static int idGrupoMenu;
        public static int idUsuario;
        public static USUARIOS? UsuarioActual;
        public static string? VersionPrograma { get; set; }
        private static string FicheroLog = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + @"\Antifraude\";
        //public static void DescargaFichero(string FicheroDestino, string FicheroOrigen, SftpClient SFTP)
        //{
        //    try
        //    {
        //        System.IO.FileStream fsd = new System.IO.FileStream(FicheroDestino, System.IO.FileMode.Create, FileAccess.ReadWrite);
        //        SFTP.DownloadFile(FicheroOrigen, fsd);
        //        fsd.Close();
        //    }
        //    catch (Exception ex)
        //    {
        //        throw;
        //    }
        //}
        public static tsUtilidades.Permisos ObtienePermisos(bdAntifraude.dbcontext.gestionantifraudeContext bd, Nullable<int> idPermiso, int idUsuario)
        {
            tsUtilidades.Permisos per = new tsUtilidades.Permisos();
            string Grupo = bd.USUARIOS.Where(x => x.IDUSUARIO == idUsuario).Select(x => x.IDGRUPONavigation!.DESCRIPCION).First() ?? "";
            if (Grupo == "TECNOSIS" || idPermiso == null)
            {
                per.Consultar = true;
                per.Eliminar = true;
                per.Nuevos = true;
                per.Otros = true;
                per.Modificar = true;
                per.Impresion = true;
                per.Exportar = true;
            }
            else
            {
                var au = from a in bd.AUTORIZACIONESUSUARIOS
                         where a.IDPERMISO == idPermiso && a.IDUSUARIO == idUsuario
                         select a;
                if (au.Count() == 0)
                {
                    //Hemos puesto int? porque int sin ? daba errores
                    int? idGrupo = (from u in bd.USUARIOS
                                    where u.IDUSUARIO == idUsuario
                                    select u).First().IDGRUPO;
                    var ag = (from g in bd.AUTORIZACIONESGRUPOS
                              where g.IDPERMISO == idPermiso && g.IDGRUPO == idGrupo
                              select g);
                    if (ag.Count() == 0)
                    {
                        per.Consultar = false;
                        per.Eliminar = false;
                        per.Nuevos = false;
                        per.Otros = false;
                        per.Modificar = false;
                        per.Impresion = false;
                        per.Exportar = false;
                    }
                    else
                    {
                        per.Consultar = ag.First().PERMITIRCONSULTAS;
                        per.Eliminar = ag.First().PERMITIRELIMINACIONES;
                        per.Nuevos = ag.First().PERMITIRNUEVOS;
                        per.Otros = ag.First().OTROSPERMISOS;
                        per.Modificar = ag.First().PERMITIRMODIFICACIONES;
                        per.Impresion = ag.First().PERMITIRIMPRESIONES;
                        per.Exportar = per.Impresion;
                    }
                }
                else
                {
                    per.Consultar = au.First().PERMITIRCONSULTAS;
                    per.Eliminar = au.First().PERMITIRELIMINACIONES;
                    per.Nuevos = au.First().PERMITIRNUEVOS;
                    per.Otros = au.First().OTROSPERMISOS;
                    per.Modificar = au.First().PERMITIRMODIFICACIONES;
                    per.Impresion = au.First().PERMITIRIMPRESIONES;
                    per.Exportar = per.Impresion;
                }
            }
            return per;
        }
        public static tsUtilidades.Permisos ObtienePermisos(bdAntifraude.dbcontext.gestionantifraudeContext bd, string Codigo, int idUsuario)
        {
            tsUtilidades.Permisos per = new tsUtilidades.Permisos();
            USUARIOS usu = bd.USUARIOS.Include(x => x.IDGRUPONavigation).Include(x => x.IDGRUPOBDNavigation).First(x => x.IDUSUARIO == idUsuario);
            if (usu?.IDGRUPONavigation?.DESCRIPCION?.ToUpper() == "TECNOSIS" || usu?.IDGRUPONavigation?.DESCRIPCION?.ToUpper() == "ADMINISTRADORES")
            //if (bd.USUARIOS.First(x => x.idUsuario == idUsuario).idGrupoNavigation.Descripcion == "TECNOSIS")
            {
                per.Consultar = true;
                per.Eliminar = true;
                per.Nuevos = true;
                per.Otros = true;
                per.Modificar = true;
                per.Impresion = true;
                per.Exportar = true;
            }
            else
            {
                var au = (from a in bd.AUTORIZACIONESUSUARIOS
                          where a.IDPERMISONavigation.CODIGOPERMISO == Codigo && a.IDUSUARIO == idUsuario
                          select a);
                if (au.Count() == 0)
                {
                    int? idGrupo = (from u in bd.USUARIOS
                                    where u.IDUSUARIO == idUsuario
                                    select u).First().IDGRUPO;
                    var ag = (from g in bd.AUTORIZACIONESGRUPOS
                              where g.IDPERMISONavigation.CODIGOPERMISO == Codigo && g.IDGRUPO == idGrupo
                              select g);
                    if (ag.Count() == 0)
                    {
                        per.Consultar = false;
                        per.Eliminar = false;
                        per.Nuevos = false;
                        per.Otros = false;
                        per.Modificar = false;
                        per.Impresion = false;
                        per.Exportar = false;
                    }
                    else
                    {
                        per.Consultar = ag.First().PERMITIRCONSULTAS;
                        per.Eliminar = ag.First().PERMITIRELIMINACIONES;
                        per.Nuevos = ag.First().PERMITIRNUEVOS;
                        per.Otros = ag.First().OTROSPERMISOS;
                        per.Modificar = ag.First().PERMITIRMODIFICACIONES;
                        per.Impresion = ag.First().PERMITIRIMPRESIONES;
                        per.Exportar = per.Impresion;
                    }
                }
                else
                {
                    per.Consultar = au.First().PERMITIRCONSULTAS;
                    per.Eliminar = au.First().PERMITIRELIMINACIONES;
                    per.Nuevos = au.First().PERMITIRNUEVOS;
                    per.Otros = au.First().OTROSPERMISOS;
                    per.Modificar = au.First().PERMITIRMODIFICACIONES;
                    per.Impresion = au.First().PERMITIRIMPRESIONES;
                    per.Exportar = per.Impresion;
                }
            }
            return per;
        }
        public static EventLog? el;
        public static string? DirectorioLogs;
        public static void AñadeLog(tsUtilidades.Enumeraciones.TipoLog Tipo, string Asunto, string Mensaje = "", Exception? e = null)
        {
            // ----------------------------------------------------------------------------------------------------
            // Descripción Sub:        Gestión de logs de la aplicación
            // Fecha. Creacion:        ???
            // Creada por:             manmog           
            // Ultima Modificacion:    24/11/2010
            // 
            // Modificaciones:
            // ===============


            string sFicheroLog = DirectorioLogs + "Log-" + DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + ".txt";
            try
            {
                if (e != null)
                {
                    if (el != null)
                        el?.WriteEntry(e.Message + Constants.vbCrLf + e.StackTrace, EventLogEntryType.Error);
                    string sStackTrace = "Tipo excepción: " + e.ToString() + Constants.vbCrLf;
                    Exception? exError = e;
                    do
                    {
                        sStackTrace += exError.StackTrace + Constants.vbCrLf;
                        exError = exError.InnerException;
                    }
                    while (exError != null);
                    if (sStackTrace != "")
                        Mensaje += Constants.vbCrLf + "StackTrace: " + sStackTrace;
                }
                switch (Tipo)
                {
                    case tsUtilidades.Enumeraciones.TipoLog.Fallo:
                    case tsUtilidades.Enumeraciones.TipoLog.Advertencia:
                        {
                            if (Tipo == tsUtilidades.Enumeraciones.TipoLog.Fallo)
                            {
                                sFicheroLog = DirectorioLogs + "Errores-" + DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString().PadLeft(2, '0') + ".txt";
                                Mensaje = DateTime.Now.ToLongTimeString() + " Error enviado desde " + Environment.MachineName + ". " + Mensaje;
                            }
                            else
                                Mensaje = DateTime.Now.ToLongTimeString() + " Advertencia enviado desde " + Environment.MachineName + ". " + Mensaje;
                            string sDireccionesEnvio = "sevilla@tecnosis.net";
                            string sServidorSMTP = "correo.tecnosis.net";
                            var sRemitente = "logs@tecnosis.es";

                            if (Environment.MachineName.ToUpper().Trim() == "INTI" || Environment.MachineName.ToUpper().Trim() == "CERBERO")
                            {
                                sDireccionesEnvio = "danmun@tecnosis.net";
                                Asunto = "[INTI] " + Asunto;
                            }

                            if (Mensaje != "")
                                Mensaje = Mensaje.Replace(Constants.vbCrLf, Constants.vbCrLf + "<br />");
                            tsUtilidades.Correo.Funciones.EnviaCorreo(sServidorSMTP, sRemitente, sDireccionesEnvio, Asunto, Mensaje);
                            break;
                        }
                }
                Anadelogtxt(Mensaje, sFicheroLog);
            }
            catch (Exception ex)
            {
                sFicheroLog = DirectorioLogs + "Errores-" + DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString().PadLeft(2, '0') + ".txt";
                Anadelogtxt(ex.Message, sFicheroLog);
            }
        }

        public static void Anadelogtxt(string Mensaje, string FicheroLog)
        {
            System.IO.StreamWriter? sw = null;
            try
            {
                Mensaje = Mensaje.Replace(Constants.vbCrLf, "---");
                if (System.IO.File.Exists(FicheroLog))
                    sw = System.IO.File.AppendText(FicheroLog);
                else
                {
                    var directorio = System.IO.Path.GetDirectoryName(FicheroLog);
                    if (!System.IO.Directory.Exists(directorio))
                        tsUtilidades.Utilidades.CreaEstructuraDirectorio(directorio);
                    sw = System.IO.File.CreateText(FicheroLog);
                }
                Mensaje = DateTime.Now.ToString() + "|" + "Ws: " + System.Diagnostics.Process.GetCurrentProcess().WorkingSet64.ToString().PadLeft(20) + " PMS: " + System.Diagnostics.Process.GetCurrentProcess().PrivateMemorySize64.ToString().PadLeft(20) + "|" + Mensaje;

                sw.WriteLine(Mensaje);
            }
            catch (Exception ex)
            {
                try
                {
                    string sDireccionesEnvio = "sevilla@tecnosis.net";
                    string sServidorSMTP = "sevilla2.tecnosis.es";
                    var sRemitente = "logs@tecnosis.es";
                    if (Environment.MachineName == "INTI" || Environment.MachineName.ToUpper().Trim() == "CERBERO")
                        sDireccionesEnvio = "danmun@tecnosis.net";
                    if (Mensaje != null)
                        Mensaje = Mensaje.Replace(Constants.vbCrLf, Constants.vbCrLf + "<br />");
                    tsUtilidades.Correo.Funciones.EnviaCorreo(sServidorSMTP, sRemitente, sDireccionesEnvio, "Error Anadelogtxt. " + Mensaje, Environment.MachineName + ".- " + ex.Message + Constants.vbCrLf + ex.StackTrace + Constants.vbCrLf + ex.Source);
                }
                catch
                {
                }
            }
            finally
            {
                try
                {
                    if (sw != null) sw.Close();
                }
                catch
                {
                }
            }
        }
        //public static void GeneraRegistroCorreoExcepcion(Exception ex, string Rutina, string CadenaConexionBD, bool MostrarMensajeError = false)
        //{
        //    try
        //    {
        //        var bd = new bdAntifraude.dbcontext.tsGestionAntifraude(false, CadenaConexionBD);
        //        string sMensaje = "Usuario: " + Usuario + Constants.vbCrLf;
        //        string sStackTrace = "Tipo excepción: " + ex.ToString() + Constants.vbCrLf;
        //        Exception? exError = ex;
        //        do
        //        {
        //            sStackTrace += exError.StackTrace + Constants.vbCrLf;
        //            exError = exError.InnerException;
        //        }
        //        while (exError != null);
        //        if (sStackTrace != "")
        //            sMensaje += Constants.vbCrLf + "StackTrace: " + sStackTrace;

        //        CUENTASCORREO cuentaorigen = (from c in bd.CUENTASCORREO
        //                                      where c.CODIGO == "TECNOSIS"
        //                                      select c).First();

        //        GeneraRegistroCorreo(bd, "Mensaje Automático. Error en " + Rutina, sMensaje, cuentaorigen, "sevilla@tecnosis.net");
        //    }
        //    catch (Exception ex2)
        //    {
        //        Anadelogtxt(ex2.Message, FicheroLog);

        //    }
        //}
        //public static void GeneraRegistroCorreoExcepcion(Exception ex, string sAsunto, string sCuerpo, string CadenaConexionBD)
        //{
        //    try
        //    {
        //        var bd = new tsGestionAntifraude(false, CadenaConexionBD);
        //        string sMensaje = sCuerpo + Constants.vbCrLf + Constants.vbCrLf + "Usuario: " + Usuario + Constants.vbCrLf + Constants.vbCrLf;
        //        string sStackTrace = "Excepción: " + ex.ToString() + Constants.vbCrLf;
        //        Exception? exError = ex;
        //        do
        //        {
        //            sStackTrace += exError.StackTrace + Constants.vbCrLf + Constants.vbCrLf;
        //            exError = exError.InnerException;
        //        }
        //        while (exError != null);
        //        if (sStackTrace != "")
        //            sMensaje += Constants.vbCrLf + "StackTrace: " + sStackTrace;

        //        CUENTASCORREO cuentaorigen = (from c in bd.CUENTASCORREO
        //                                      where c.CODIGO == "TECNOSIS"
        //                                      select c).First();
        //        GeneraRegistroCorreo(bd, sAsunto, sMensaje, cuentaorigen, "sevilla@tecnosis.net");
        //    }
        //    catch (Exception ex2)
        //    {
        //        Anadelogtxt(ex2.Message, FicheroLog);

        //    }
        //}
        public static void GeneraRegistroCorreoExcepcion(tsGestionAntifraude bd, Exception ex, string sAsunto, string sCuerpo)
        {
            try
            {
                string sMensaje = sCuerpo + Constants.vbCrLf + Constants.vbCrLf + "Usuario: " + Usuario + Constants.vbCrLf + Constants.vbCrLf;
                string sStackTrace = "Excepción: " + ex.ToString() + Constants.vbCrLf;
                Exception? exError = ex;
                do
                {
                    sStackTrace += exError.StackTrace + Constants.vbCrLf + Constants.vbCrLf;
                    exError = exError.InnerException;
                }
                while (exError != null);
                if (sStackTrace != "")
                    sMensaje += Constants.vbCrLf + "StackTrace: " + sStackTrace;

                CUENTASCORREO cuentaorigen = (from c in bd.CUENTASCORREO
                                              where c.CODIGO == "TECNOSIS"
                                              select c).First();

                GeneraRegistroCorreo(bd, sAsunto, sMensaje, cuentaorigen, "sevilla@tecnosis.net");
            }
            catch (Exception ex2)
            {
                Anadelogtxt(ex2.Message, FicheroLog);
            }
        }
        //public static DateTime AhoraMysql(tsGestionAntifraude deGestionGuadex)
        //{
        //    try
        //    {
        //        DateTime FechaServidor = (deGestionGuadex as IObjectContextAdapter).ObjectContext.ExecuteStoreQuery<DateTime>("select now() as Ahora").First();
        //        return FechaServidor;
        //    }
        //    catch
        //    {
        //        return DateTime.Now;
        //    }
        //}
        public static void GeneraRegistroCorreo(tsGestionAntifraude bd, string Asunto, string Cuerpo)
        {
            try
            {
                CUENTASCORREO cuentaorigen = (from c in bd.CUENTASCORREO
                                              where c.CODIGO == "TECNOSIS"
                                              select c).First();
                var correo = new CORREOS()
                {
                    ASUNTO = Asunto,
                    CUERPO = Cuerpo,
                    DESTINATARIO = "sevilla@tecnosis.net",
                    DIRECCIONRESPUESTA = cuentaorigen.REMITENTE,
                    //FECHACREACION = bd.AhoraMySql(),
                    IDCUENTA = cuentaorigen.IDCUENTA,
                    REMITENTE = cuentaorigen.REMITENTE
                };
                if (Environment.MachineName.ToUpper() == "INTI" || Environment.MachineName.ToUpper().Trim() == "CERBERO")
                    correo.DESTINATARIO = "danmun@tecnosis.net";
                // // Reemplazar los saltos de línea con <br> porque el correo va en HTML, y si no hacemos esto
                // // no habrá saltos de línea dentro del correo.
                if (correo.CUERPO != null)
                    correo.CUERPO = correo.CUERPO.Replace(Constants.vbCrLf, Constants.vbCrLf + "<br />");
                // // Guardar en la bd.
                bd.Add(correo);
                bd.GuardarCambios();
            }
            catch (Exception ex)
            {
                Debug.Write(ex.Message);
                throw;
            }
        }
        public static void GeneraRegistroCorreo(tsGestionAntifraude bd, string Asunto, string Cuerpo, CUENTASCORREO cuenta, string Destinatario)
        {
            try
            {
                var correo = new CORREOS()
                {
                    ASUNTO = Asunto,
                    CUERPO = Cuerpo,
                    DESTINATARIO = Destinatario,
                    DIRECCIONRESPUESTA = cuenta.REMITENTE,
                    //FECHACREACION = bd.AhoraMySql(),
                    IDCUENTA = cuenta.IDCUENTA,
                    REMITENTE = cuenta.REMITENTE
                };
                if (Environment.MachineName.ToUpper() == "INTI" || Environment.MachineName.ToUpper().Trim() == "CERBERO")
                    Destinatario = "danmun@tecnosis.net";
                bd.CORREOS.Add(correo);
                bd.GuardarCambios();
            }
            catch (Exception ex)
            {
                Debug.Write(ex.Message);
                throw;
            }
        }
    }
}
