using System;
using System.IO;
using System.Linq;
using Renci.SshNet;
using bdAntifraude.dbcontext;
using SwaggerAntifraude.Models;
using Microsoft.EntityFrameworkCore;
using bdAntifraude.clases;

namespace SwaggerAntifraude.Servicios
{

    public class ServicioAlmacenamiento
    {
        private static IConfiguration Conf { get; set; }
        public ResultadoAlmacenaFicheroAtransmitir DevolverResultadoAlmacenaFicheroAtransmitir(int idRegistro, string tabla, string ficheroBase64)
        {
            var resultado = new ResultadoAlmacenaFicheroAtransmitir();

            try
            {
                // Convertir el archivo Base64 a un flujo
                var stream = new MemoryStream(Convert.FromBase64String(ficheroBase64));

                // Obtener el nombre de la base de datos utilizando el contexto
                string baseDeDatos;
                using (var context = tsGestionAntifraude.NuevoContexto(SoloLectura: true))
                {
                    baseDeDatos = context.Database.GetDbConnection().Database;
                }

                if (string.IsNullOrEmpty(baseDeDatos))
                {
                    Conf = new ConfigurationBuilder()
               .AddJsonFile("appsettings.json")
               .Build();
                    baseDeDatos = Conf.GetSection("BaseDatos").Value; ;
                }

                // Conectar al servidor SFTP utilizando el contexto
                using (var context = tsGestionAntifraude.NuevoContexto(SoloLectura: true))
                using (var clienteSftp = ConectarServidorSftp(context))
                {
                    clienteSftp.Connect();

                    // Generar la ruta base
                    string ruta = $"{baseDeDatos.ToLower()}/registrodepersonal";

                    switch (tabla.ToUpper())
                    {
                        case "LINEAVIDAADMINISTRATIVA":
                            ruta += "/lineavidaadministrativa/";
                            break;
                        case "FORMACION":
                            ruta += "/formacion/";
                            break;
                        case "TITULACION":
                            ruta += "/titulacion/";
                            break;
                        case "DOCENCIA":
                            ruta += "/docencia/";
                            break;
                        case "INCIDENCIA":
                            ruta = $"{baseDeDatos.ToLower()}/control_horario/";
                            break;
                        default:
                            resultado.Resultado = 1;
                            resultado.Mensaje = "Tabla no contemplada entre las posibles para tener ficheros";
                            return resultado;
                    }

                    // Subir el archivo al servidor SFTP
                    ruta += $"{idRegistro}.pdf";
                    clienteSftp.UploadFile(stream, ruta);
                    clienteSftp.Disconnect();

                    resultado.Resultado = 0;
                    resultado.Mensaje = "Fichero almacenado";
                }
            }
            catch (Exception ex)
            {
                resultado.Resultado = 1;
                resultado.Mensaje = $"ERROR de generación: {ex.Message}";

                if (ex.InnerException != null)
                {
                    resultado.Mensaje += $" {ex.InnerException.Message}";
                }
            }

            return resultado;
        }



        public ResultadoObtenFicheroAtransmitir DevolverObtenFicheroAtransmitir(int idRegistro, string tabla, string nif)
        {
            var resultado = new ResultadoObtenFicheroAtransmitir();

            try
            {
                // Obtener el nombre de la base de datos utilizando el contexto
                string baseDeDatos;
                using (var context = tsGestionAntifraude.NuevoContexto(SoloLectura: true))
                {
                    baseDeDatos = context.Database.GetDbConnection().Database;
                }

                Conf = new ConfigurationBuilder()
          .AddJsonFile("appsettings.json")
          .Build();
                baseDeDatos = Conf.GetSection("BaseDatos").Value; ;

                //if (string.IsNullOrEmpty(baseDeDatos))
                //{
                //    baseDeDatos = "preproduccion";
                //}

                // Generar la ruta base
                string ruta = $"{baseDeDatos.ToLower()}/registrodepersonal";

                switch (tabla.ToUpper())
                {
                    case "LINEAVIDAADMINISTRATIVA":
                        ruta += "/lineavidaadministrativa/";
                        break;
                    case "FORMACION":
                        ruta += "/formacion/";
                        break;
                    case "TITULACION":
                        ruta += "/titulacion/";
                        break;
                    case "DOCENCIA":
                        ruta += "/docencia/";
                        break;
                    case "INCIDENCIA":
                        ruta = $"{baseDeDatos.ToLower()}/control_horario/";
                        break;
                    case "CSV":
                        using (var context = tsGestionAntifraude.NuevoContexto(SoloLectura: true))
                        {
                            //ruta += context.VALIDACIONDOCUMENTOS.First(x => x.CSV == nif).RUTAFICHERO;
                        }
                        break;
                    default:
                        resultado.Resultado = 1;
                        resultado.Mensaje = "Tabla no contemplada entre las posibles para tener ficheros";
                        return resultado;
                }

                if (tabla.ToUpper() != "CSV")
                {
                    ruta += $"{idRegistro}.pdf";
                }

                resultado.Mensaje = $"Ruta: {ruta}";

                // Descargar el archivo desde el servidor SFTP
                using (var context = tsGestionAntifraude.NuevoContexto(SoloLectura: true))
                using (var clienteSftp = ConectarServidorSftp(context))
                {
                    clienteSftp.Connect();

                    using var memoryStream = new MemoryStream();
                    clienteSftp.DownloadFile(ruta, memoryStream);
                    clienteSftp.Disconnect();

                    resultado.Pdf = memoryStream.ToArray();
                }

                resultado.Resultado = 0;
            }
            catch (Exception ex)
            {
                resultado.Resultado = 1;
                resultado.Mensaje = $"ERROR de generación: {ex.Message}";

                if (ex.InnerException != null)
                {
                    resultado.Mensaje += $" {ex.InnerException.Message}";
                }
            }

            return resultado;
        }


        private SftpClient ConectarServidorSftp(tsGestionAntifraude context)
        {
            var configuraciones = context.ENUMERACIONES
                .Where(x => x.IDGRUPOENUMERACIONNavigation.GRUPO == "SERVIDORSFTP")
                .ToList();

            var servidor = configuraciones.First(n => n.CODIGO == "SERVIDORSFTP.SERVIDOR").VALORALFABETICO1;
            var puerto = int.Parse(configuraciones.First(n => n.CODIGO == "SERVIDORSFTP.PUERTO").VALORALFABETICO1);
            var usuario = configuraciones.First(n => n.CODIGO == "SERVIDORSFTP.USUARIO").VALORALFABETICO1;
            var clave = tsUtilidades.crypt.FEncS(
                configuraciones.First(n => n.CODIGO == "SERVIDORSFTP.CLAVE").VALORALFABETICO1,
                "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/\\-*",
                "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/\\-*",
                -875421649);

            return new SftpClient(servidor, puerto, usuario, clave);
        }
    }
}
