using BarcodeLib;
using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Modelos_Informes;
using Exferia_EntityFramework;
using Exferia_Informes._1_Datos;
using Exferia_Informes.General;
using Exferia_Informes.Informes.Mandatos;
using Exferia_Informes.Informes.ZEC.Cartas;
using Exferia_Informes.Informes.ZEC.Vencimiento;
using Microsoft.Reporting.WinForms;
using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.Drawing.Printing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Exferia_Informes.Informes
{
    public class Crear_Pdfs_Informes
    {
        #region Variables privadas
        private string g_str_Extension = ".pdf";

        private INF_ConfiguracionVencimientos_Socios_Datos g_obj_INF_ConfiguracionVencimientos_Datos = new INF_ConfiguracionVencimientos_Socios_Datos();

        private INTERNO_Informes_Vencimiento_Modelo g_mdl_INTERNO_Informes_Vencimiento_Modelo = null;
        private INTERNO_Informes_Acreedor_Modelo g_mdl_INTERNO_Informes_Acreedor_Modelo = null;
        private INF_ConfiguracionVencimientos_Socios g_mdl_INF_ConfiguracionVencimientos_Socios = null;
        #endregion

        public bool Crear_Pdf_Vencimiento(INTERNO_Informes_Vencimiento_Modelo _mdl_INTERNO_Informes_Vencimiento_Modelo, INTERNO_Informes_Acreedor_Modelo _mdl_INTERNO_Informes_Acreedor_Modelo)
        {
            bool bol_TodoCorrecto = true;
            try
            {

                g_mdl_INTERNO_Informes_Vencimiento_Modelo = _mdl_INTERNO_Informes_Vencimiento_Modelo;
                g_mdl_INTERNO_Informes_Acreedor_Modelo = _mdl_INTERNO_Informes_Acreedor_Modelo;
                
                //Buscar INF_ConfiguracionVencimientos_Socios
                g_mdl_INF_ConfiguracionVencimientos_Socios = g_obj_INF_ConfiguracionVencimientos_Datos.Obtener_Modelo_Por_IdEjercicio(g_mdl_INTERNO_Informes_Vencimiento_Modelo.Ejercicio_id);

                //Creamos el ReportViewer......................
                ReportViewer rpv = new ReportViewer();
                rpv.LocalReport.ReportEmbeddedResource = "Exferia_Informes.Informes.ZEC.Vencimiento.inf_Vencimientos_ZEC.rdlc";

                //Rellenar Informe
                Rellenar_DataSet_Vencimientos.Rellenar_Vencimiento(rpv.LocalReport.DataSources,g_mdl_INF_ConfiguracionVencimientos_Socios, g_mdl_INTERNO_Informes_Vencimiento_Modelo, g_mdl_INTERNO_Informes_Acreedor_Modelo);

                bol_TodoCorrecto = Imprimir_En_Ruta(rpv, Variables.G_LNG_RUTA_VENCIMIENTO);

                rpv.Dispose();
            }
            catch (Control_Errores)
            {
                bol_TodoCorrecto = false;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(Crear_Pdfs_Informes) + "/" + nameof(Crear_Pdf_Vencimiento));
                bol_TodoCorrecto = false;
            }

            return bol_TodoCorrecto;
        }

        #region Crear PDFS Cartas
        public bool Crear_Pdf_Cartas(INTERNO_Informes_Vencimiento_Modelo _mdl_INTERNO_Informes_Vencimiento_Modelo, INTERNO_Informes_Acreedor_Modelo _mdl_INTERNO_Informes_Acreedor_Modelo)
        {
            bool bol_TodoCorrecto = true;
            try
            {
                g_mdl_INTERNO_Informes_Vencimiento_Modelo = _mdl_INTERNO_Informes_Vencimiento_Modelo;
                g_mdl_INTERNO_Informes_Acreedor_Modelo = _mdl_INTERNO_Informes_Acreedor_Modelo;

                //Si es Inicial no imprimir ninguna Carta
                if (g_mdl_INTERNO_Informes_Vencimiento_Modelo.Tipo_Inicial_Permanencia_Baja != 0)
                {
                    //Buscar INF_ConfiguracionVencimientos_Socios
                    g_mdl_INF_ConfiguracionVencimientos_Socios = g_obj_INF_ConfiguracionVencimientos_Datos.Obtener_Modelo_Por_IdEjercicio(g_mdl_INTERNO_Informes_Vencimiento_Modelo.Ejercicio_id);

                    //Creamos el ReportViewer......................
                    ReportViewer rpv = new ReportViewer();

                    //Ver si esta dado de baja en el ejercicioactual
                    if (g_mdl_INTERNO_Informes_Vencimiento_Modelo.Tipo_Inicial_Permanencia_Baja == 2)
                    {
                        //Con Domiciliacion
                        if (g_mdl_INTERNO_Informes_Vencimiento_Modelo.Entidad_IBAN != null && g_mdl_INTERNO_Informes_Vencimiento_Modelo.Entidad_IBAN.Trim().Length > 0)
                        {
                            rpv.LocalReport.ReportEmbeddedResource = "Exferia_Informes.Informes.Con_SubInformes.Cartas.inf_BajaConDomiciliacion.rdlc";
                        }
                        //Sin Domiciliacion
                        else
                        {
                            rpv.LocalReport.ReportEmbeddedResource = "Exferia_Informes.Informes.Con_SubInformes.Cartas.inf_BajaSinDomiciliacion.rdlc";
                        }
                    }
                    //Es de Permanencia Inicial
                    else if (g_mdl_INTERNO_Informes_Vencimiento_Modelo.Tipo_Inicial_Permanencia_Baja == 3)
                    {
                        //Con Domiciliacion
                        if (g_mdl_INTERNO_Informes_Vencimiento_Modelo.Entidad_IBAN != null && g_mdl_INTERNO_Informes_Vencimiento_Modelo.Entidad_IBAN.Trim().Length > 0)
                        {
                            rpv.LocalReport.ReportEmbeddedResource = "Exferia_Informes.Informes.Con_SubInformes.Cartas.inf_Mandato_CargoCuenta.rdlc";
                        }
                        //Sin Domiciliacion
                        else
                        {
                            rpv.LocalReport.ReportEmbeddedResource = "Exferia_Informes.Informes.Con_SubInformes.Cartas.inf_Mandato_Inicial.rdlc";
                        }
                    }
                    //Es de Permanencia General
                    else if (g_mdl_INTERNO_Informes_Vencimiento_Modelo.Tipo_Inicial_Permanencia_Baja == 1)
                    {
                        //Con Domiciliacion
                        if (g_mdl_INTERNO_Informes_Vencimiento_Modelo.Entidad_IBAN != null && g_mdl_INTERNO_Informes_Vencimiento_Modelo.Entidad_IBAN.Trim().Length > 0)
                        {
                            rpv.LocalReport.ReportEmbeddedResource = "Exferia_Informes.Informes.Con_SubInformes.Cartas.inf_Mandato_CargoCuenta.rdlc";
                        }
                        //Sin Domiciliacion
                        else
                        {
                            rpv.LocalReport.ReportEmbeddedResource = "Exferia_Informes.Informes.Con_SubInformes.Cartas.inf_Mandato_Inicial.rdlc";
                        }
                    }

                    //Agregar los SubInformes
                    rpv.LocalReport.SubreportProcessing += new SubreportProcessingEventHandler(Rellenar_SubInformes_Cartas);

                    bol_TodoCorrecto = Imprimir_En_Ruta(rpv, Variables.G_LNG_RUTA_CARTAS);

                    rpv.Dispose();
                }
            }
            catch (Control_Errores)
            {
                bol_TodoCorrecto = false;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(Crear_Pdfs_Informes) + "/" + nameof(Crear_Pdf_Cartas));
                bol_TodoCorrecto = false;
            }

            return bol_TodoCorrecto;
        }
        public void Rellenar_SubInformes_Cartas(object sender, SubreportProcessingEventArgs e)
        {
           
            //inf_Carta_Inicial
            if (e.ReportPath.Equals("Exferia_Informes.Informes.ZEC.Cartas.inf_Carta_Inicial.rdlc"))
            {
                Rellenar_DataSet_Cartas.Rellenar_CartaInicial(e.DataSources, g_mdl_INF_ConfiguracionVencimientos_Socios, g_mdl_INTERNO_Informes_Vencimiento_Modelo.Ejercicio_Anyo);
            }
            //inf_Carta_Baja_ConDomiciliacion
            else if (e.ReportPath.Equals("Exferia_Informes.Informes.ZEC.Cartas.inf_Carta_Baja_ConDomiciliacion.rdlc"))
            {
                Rellenar_DataSet_Cartas.Rellenar_CartaBaja_ConDomiciliacion(e.DataSources, g_mdl_INF_ConfiguracionVencimientos_Socios,g_mdl_INTERNO_Informes_Vencimiento_Modelo);
            }
            //inf_Carta_Baja_SinDomiciliacion
            else if (e.ReportPath.Equals("Exferia_Informes.Informes.ZEC.Cartas.inf_Carta_Baja_SinDomiciliacion.rdlc"))
            {
                Rellenar_DataSet_Cartas.Rellenar_CartaBaja_SinDomiciliacion(e.DataSources, g_mdl_INF_ConfiguracionVencimientos_Socios, g_mdl_INTERNO_Informes_Vencimiento_Modelo);
            }
            //inf_Carta_InformacionCargoCuenta
            else if (e.ReportPath.Equals("Exferia_Informes.Informes.ZEC.Cartas.inf_Carta_InformacionCargoCuenta.rdlc"))
            {
                Rellenar_DataSet_Cartas.Rellenar_InformacionCargoCuenta(e.DataSources, g_mdl_INF_ConfiguracionVencimientos_Socios, g_mdl_INTERNO_Informes_Vencimiento_Modelo);
            }
            //inf_Mandato_CORE
            else if (e.ReportPath.Equals("Exferia_Informes.Informes.Mandatos.inf_Mandato_CORE.rdlc"))
            {
                Rellenar_DataSet_Mandatos.Rellenar_Mandato_Simple(e.DataSources, g_mdl_INF_ConfiguracionVencimientos_Socios.imagen_Logo_Carta_SuperiorIzquierda, g_mdl_INTERNO_Informes_Vencimiento_Modelo,g_mdl_INTERNO_Informes_Acreedor_Modelo);
            }
            //inf_Carta_NotificacionTasaAnual
            else if (e.ReportPath.Equals("Exferia_Informes.Informes.ZEC.Cartas.inf_Carta_NotificacionTasaAnual.rdlc"))
            {
                Rellenar_DataSet_Cartas.Rellenar_NotificacionTasaAnual(e.DataSources, g_mdl_INF_ConfiguracionVencimientos_Socios, g_mdl_INTERNO_Informes_Vencimiento_Modelo);
            }
        }

        public bool Crear_Pdf_CartaNotificacionTasaAnual(INTERNO_Informes_Vencimiento_Modelo _mdl_INTERNO_Informes_Vencimiento_Modelo, INTERNO_Informes_Acreedor_Modelo _mdl_INTERNO_Informes_Acreedor_Modelo)
        {
            bool bol_TodoCorrecto = true;
            try
            {
                g_mdl_INTERNO_Informes_Vencimiento_Modelo = _mdl_INTERNO_Informes_Vencimiento_Modelo;
                g_mdl_INTERNO_Informes_Acreedor_Modelo = _mdl_INTERNO_Informes_Acreedor_Modelo;

                //Si es Inicial no imprimir ninguna Carta
                if (g_mdl_INTERNO_Informes_Vencimiento_Modelo.Tipo_Inicial_Permanencia_Baja != 0)
                {
                    //Buscar INF_ConfiguracionVencimientos_Socios
                    g_mdl_INF_ConfiguracionVencimientos_Socios = g_obj_INF_ConfiguracionVencimientos_Datos.Obtener_Modelo_Por_IdEjercicio(g_mdl_INTERNO_Informes_Vencimiento_Modelo.Ejercicio_id);

                    //Creamos el ReportViewer......................
                    ReportViewer rpv = new ReportViewer();
                    
                    rpv.LocalReport.ReportEmbeddedResource = "Exferia_Informes.Informes.ZEC.Cartas.inf_Carta_NotificacionTasaAnual.rdlc";

                    //Agregar datos Informe
                    Rellenar_DataSet_Cartas.Rellenar_NotificacionTasaAnual(rpv.LocalReport.DataSources, g_mdl_INF_ConfiguracionVencimientos_Socios, g_mdl_INTERNO_Informes_Vencimiento_Modelo);

                    bol_TodoCorrecto = Imprimir_En_Ruta(rpv, Variables.G_LNG_RUTA_CARTASNOTIFICACIONTASAANUAL);

                    rpv.Dispose();
                }
            }
            catch (Control_Errores)
            {
                bol_TodoCorrecto = false;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(Crear_Pdfs_Informes) + "/" + nameof(Crear_Pdf_CartaNotificacionTasaAnual));
                bol_TodoCorrecto = false;
            }

            return bol_TodoCorrecto;
        }
        #endregion

        #region Crear PDFS Providencia de Apremio (AEAT)
        public string Crear_Pdf_ProvidenciaApremio(INTERNO_Informes_ProvidenciaApremio_Modelo _mdl_INTERNO_Informes_ProvidenciaApremio_Modelo,bool _bol_Firmado)
        {
            string str_RutaFicheroGenerado= "";
            try
            {

                //Buscar INF_ConfiguracionVencimientos_Socios
                g_mdl_INF_ConfiguracionVencimientos_Socios = g_obj_INF_ConfiguracionVencimientos_Datos.Obtener_Modelo_Por_IdEjercicio(_mdl_INTERNO_Informes_ProvidenciaApremio_Modelo.Ejercicio_id);

                long lng_IdRuta = Variables.G_LNG_RUTA_PROVIDENCIAAPREMIO_CONFIRMA;

                //Quitamos la firma de la presidenta
                if (_bol_Firmado == false)
                {
                    g_mdl_INF_ConfiguracionVencimientos_Socios.presindente_Firma = null;
                    lng_IdRuta = Variables.G_LNG_RUTA_PROVIDENCIAAPREMIO_SINFIRMA;
                }

                //Creamos el ReportViewer...........................................................
                ReportViewer rpv = new ReportViewer();
                rpv.LocalReport.ReportEmbeddedResource = "Exferia_Informes.Informes.ZEC.ProvidenciaApremio.inf_ProvidenciaApremio.rdlc";

                //Rellenar Informe
                Rellenar_DataSet_ProvidenciaApremio.Rellenar_ProvidenciaApremio(rpv.LocalReport.DataSources, g_mdl_INF_ConfiguracionVencimientos_Socios, _mdl_INTERNO_Informes_ProvidenciaApremio_Modelo);



                str_RutaFicheroGenerado = Imprimir_En_Ruta_ProvidenciaApremio(rpv, lng_IdRuta, _mdl_INTERNO_Informes_ProvidenciaApremio_Modelo);

                rpv.Dispose();
            }
            catch (Control_Errores)
            {
                str_RutaFicheroGenerado = "";
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(Crear_Pdfs_Informes) + "/" + nameof(Crear_Pdf_ProvidenciaApremio));
                str_RutaFicheroGenerado = "";
            }

            return str_RutaFicheroGenerado;
        }

        private string Imprimir_En_Ruta_ProvidenciaApremio(ReportViewer _rpv, long _lng_idRuta,INTERNO_Informes_ProvidenciaApremio_Modelo _mdl_INTERNO_Informes_ProvidenciaApremio_Modelo)
        {
            string str_Ruta_Final = "";

            try
            {
                

                INF_Rutas mdl_INF_Rutas = Variables.G_LST_RUTAS.Where(m => m.id.Equals(_lng_idRuta)).FirstOrDefault();
                if (mdl_INF_Rutas != null)
                {

                    List<INTERNO_CodigoDescripcion_Modelo> lst_INTERNO_CodigoDescripcion_Modelo = new List<INTERNO_CodigoDescripcion_Modelo>();
                    lst_INTERNO_CodigoDescripcion_Modelo.Add(new INTERNO_CodigoDescripcion_Modelo(Variables.G_MDL_PARAMETRO_RUTA_FECHA.Codigo, DateTime.Now.ToString("yyyyMMdd")));
                    lst_INTERNO_CodigoDescripcion_Modelo.Add(new INTERNO_CodigoDescripcion_Modelo(Variables.G_MDL_PARAMETRO_RUTA_HORA.Codigo, DateTime.Now.ToString("HHmmss")));
                    lst_INTERNO_CodigoDescripcion_Modelo.Add(new INTERNO_CodigoDescripcion_Modelo(Variables.G_MDL_PARAMETRO_RUTA_EJERCICIO.Codigo, _mdl_INTERNO_Informes_ProvidenciaApremio_Modelo.Ejercicio_Anyo));
                    lst_INTERNO_CodigoDescripcion_Modelo.Add(new INTERNO_CodigoDescripcion_Modelo(Variables.G_MDL_PARAMETRO_RUTA_CODIGO_SOCIO.Codigo, _mdl_INTERNO_Informes_ProvidenciaApremio_Modelo.Entidad_Codigo));
                    lst_INTERNO_CodigoDescripcion_Modelo.Add(new INTERNO_CodigoDescripcion_Modelo(Variables.G_MDL_PARAMETRO_RUTA_ROEZEC.Codigo, _mdl_INTERNO_Informes_ProvidenciaApremio_Modelo.Entidad_roeZEC));
                    lst_INTERNO_CodigoDescripcion_Modelo.Add(new INTERNO_CodigoDescripcion_Modelo(Variables.G_MDL_PARAMETRO_RUTA_CIFNIF.Codigo, _mdl_INTERNO_Informes_ProvidenciaApremio_Modelo.Entidad_CIF));

                    str_Ruta_Final = Funciones.Transformar_Ruta(mdl_INF_Rutas.rutaFichero, mdl_INF_Rutas.nombreFichero, g_str_Extension, lst_INTERNO_CodigoDescripcion_Modelo);
                    
                    Funciones_Informes.Imprimir_ReportAutomatico(_rpv, str_Ruta_Final, g_str_Extension);
                    
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(Crear_Pdfs_Informes) + "/" + nameof(Imprimir_En_Ruta_ProvidenciaApremio));
                str_Ruta_Final = "";
            }
            return str_Ruta_Final;
        }

        #endregion

        private bool Imprimir_En_Ruta(ReportViewer _rpv,long _lng_idRuta)
        {
            bool bol_TodoCorrecto = true;
            
            try
            {
                INF_Rutas mdl_INF_Rutas = Variables.G_LST_RUTAS.Where(m => m.id.Equals(_lng_idRuta)).FirstOrDefault();
                if (mdl_INF_Rutas != null)
                {
                    List<INTERNO_CodigoDescripcion_Modelo> lst_INTERNO_CodigoDescripcion_Modelo = new List<INTERNO_CodigoDescripcion_Modelo>();
                    lst_INTERNO_CodigoDescripcion_Modelo.Add(new INTERNO_CodigoDescripcion_Modelo(Variables.G_MDL_PARAMETRO_RUTA_CODIGO_EMPRESA.Codigo, g_mdl_INTERNO_Informes_Vencimiento_Modelo.Empresa_Codigo));
                    lst_INTERNO_CodigoDescripcion_Modelo.Add(new INTERNO_CodigoDescripcion_Modelo(Variables.G_MDL_PARAMETRO_RUTA_FECHA.Codigo, DateTime.Now.ToString("yyyyMMdd")));
                    lst_INTERNO_CodigoDescripcion_Modelo.Add(new INTERNO_CodigoDescripcion_Modelo(Variables.G_MDL_PARAMETRO_RUTA_HORA.Codigo, DateTime.Now.ToString("HHmmss")));
                    lst_INTERNO_CodigoDescripcion_Modelo.Add(new INTERNO_CodigoDescripcion_Modelo(Variables.G_MDL_PARAMETRO_RUTA_EJERCICIO.Codigo, g_mdl_INTERNO_Informes_Vencimiento_Modelo.Ejercicio_Anyo));
                    lst_INTERNO_CodigoDescripcion_Modelo.Add(new INTERNO_CodigoDescripcion_Modelo(Variables.G_MDL_PARAMETRO_RUTA_CODIGO_SOCIO.Codigo, g_mdl_INTERNO_Informes_Vencimiento_Modelo.Entidad_Codigo));
                    lst_INTERNO_CodigoDescripcion_Modelo.Add(new INTERNO_CodigoDescripcion_Modelo(Variables.G_MDL_PARAMETRO_RUTA_ROEZEC.Codigo, g_mdl_INTERNO_Informes_Vencimiento_Modelo.Entidad_roeZEC));
                    lst_INTERNO_CodigoDescripcion_Modelo.Add(new INTERNO_CodigoDescripcion_Modelo(Variables.G_MDL_PARAMETRO_RUTA_CIFNIF.Codigo, g_mdl_INTERNO_Informes_Vencimiento_Modelo.Entidad_CIF));

                    //Tipo de Vencimiento
                    string str_TipoVencimiento = "";
                    if (g_mdl_INTERNO_Informes_Vencimiento_Modelo.Tipo_Inicial_Permanencia_Baja.Equals(0))
                    {
                        str_TipoVencimiento = "I";
                    }
                    else if (g_mdl_INTERNO_Informes_Vencimiento_Modelo.Tipo_Inicial_Permanencia_Baja.Equals(1))
                    {
                        str_TipoVencimiento = "G";
                    }
                    else if (g_mdl_INTERNO_Informes_Vencimiento_Modelo.Tipo_Inicial_Permanencia_Baja.Equals(2))
                    {
                        str_TipoVencimiento = "F";
                    }
                    else if (g_mdl_INTERNO_Informes_Vencimiento_Modelo.Tipo_Inicial_Permanencia_Baja.Equals(3))
                    {
                        str_TipoVencimiento = "P";
                    }
                    lst_INTERNO_CodigoDescripcion_Modelo.Add(new INTERNO_CodigoDescripcion_Modelo(Variables.G_MDL_PARAMETRO_RUTA_TIPOVECIMIENTO.Codigo, str_TipoVencimiento));

                    string str_RutaFichero = Funciones.Transformar_Ruta(mdl_INF_Rutas.rutaFichero, mdl_INF_Rutas.nombreFichero, g_str_Extension, lst_INTERNO_CodigoDescripcion_Modelo);

                    Funciones_Informes.Imprimir_ReportAutomatico(_rpv, str_RutaFichero, g_str_Extension);
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(Crear_Pdfs_Informes) + "/" + nameof(Imprimir_En_Ruta));
                bol_TodoCorrecto = false;
            }
            return bol_TodoCorrecto;
        }

    }
}
