// 
// Copyright 2016 Agencia Estatal de Administración Tibutaria
//
// Licencia con arreglo a la EUPL, Versión 1.1 o -en cuanto
// sean aprobadas por la Comisión Europea- versiones
// posteriores de la EUPL (la «Licencia»);
// Solo podrá usarse esta obra si se respeta la Licencia.
// Puede obtenerse una copia de la Licencia en:
//  
// https://joinup.ec.europa.eu/software/page/eupl
//  
// Salvo cuando lo exija la legislación aplicable o se acuerde
// por escrito, el programa distribuido con arreglo a la
// Licencia se distribuye «TAL CUAL», SIN GARANTÍAS NI CONDICIONES
// DE NINGÚN TIPO, ni expresasni implícitas.
//
// Véase la Licencia en el idioma concreto que rige los permisos y 
// limitaciones que establece la Licencia.
// 

using System;
using System.Collections.Generic;
using System.Text;
using operador.iexplorer;
using ateneo.utiles;

namespace operador
{
    public class ProcesoClienteNotificaciones : ProcesoCliente
    {
        public ProcesoClienteNotificaciones(Principal central) : base(central) { }


        public override void procesoInicial() {
            if (Configuracion.instanciaUnica().navegarIntranet) {
                central.ieControl.esperarEstadocompleto();
                navegar();
            }
        }

        public override void procesoFinalizacionEspecial() {
            if (central.ieControl != null) {
                central.ieControl.cerrarVentanaSec();
                if (!central.quedanEnLista()) {
                    central.ieControl.navegarHome();
                }
            }
        }

        public override string getMensajeFinalizacion() {
            return "1|0|0|0|0|0|" + ticket + "|" + colaActual.cola;
        }

        public override void navegar() {
            if (nif.ToUpper().StartsWith("XX")) {
                return;
            }
            string url1 = "https://www.aeat/L/iniinvoc/es.aeat.dit.adu.gnno.nots.cnp.CnpAccion?accion=consulta&nifContribuyente=";
            url1 = url1 + nif + "&nombreContribuyente=&nifReceptor=&nombreReceptor=&calidad=00&relleno=on";
            Win32Apis.ignorarAlertasDeExplorer(central.ieControl.processId);
            if (!central.cargarPagina(url1, url1)) {
                return;
            }
            try {
                IEDocument doc = central.ieControl.documento;
                int resultado = central.ieControl.esperarIE(20000);
                if (resultado != (int)ESTADO_NAVEGADOR.TERMINADA) {
                    return;
                }
                System.Threading.Thread.Sleep(2000);
                Win32Apis.procesarAlertasDeExplorer(central.ieControl.processId);
                doc = central.ieControl.documento;
                string txtPagina = doc.getInnerHTML();
                int notificacionesEmitidas = numeroNotificaciones(txtPagina);

                if (notificacionesEmitidas > 0) {
                    generarNotificaciones(notificacionesEmitidas);
                    System.Windows.Forms.MessageBox.Show("Tiene notificaciones pendientes en calidad de\n    DESTINATARIO LEGAL.\nCompruebe el navegador");
                    central.traerAlFrente();
                    central.ieControl.setPaginaEsperada(null);
                    return;
                } 
                if (notificacionesEmitidas == 0) {
                    central.ieControl.navegar("https://www.aeat/es13/S/BUNCBUNDW0CN?CAB-MOTIVO=" + central.motivoIntranet + "&E_NIU=&E_TIPDOM=&E_TIPDOMI=&E_RESP=&E_SW=1&E_OPCIDEN=1&undefined=undefined&E_APENOM=&E_FECNAC=&E_APELLIDO=&E_NOMBRE=&E_RAZONSOC=&undefined=undefined&E_DELEGA=00&undefined=undefined&E_NIF=" + nif + "&E_APENIF=-");
                    central.ieControl.setPaginaEsperada(null);
                }
            } catch (Exception ex) {
                LogExcepcion.guardar("Error en navegar en ClienteNotificaciones", ex);
            }
        }

        private int numeroNotificaciones(string txtPagina) {
            int notificacionesEmitidasT = 0;
            int notificacionesEmitidasD = 0;
            try {
                string cadena = "Nº Notificaciones pendientes como titular:";
                int posVarReserva = txtPagina.IndexOf(cadena);
                if (posVarReserva == -1) {
                    return -1;
                }
                string reserva = txtPagina.Substring((posVarReserva + cadena.Length + 10), 10);
                reserva = limpiarReserva(reserva);
                if (!Int32.TryParse(reserva, out notificacionesEmitidasT)) {
                    return -1;
                }
                cadena = "Nº Notificaciones pendientes como destinatario:";
                posVarReserva = txtPagina.IndexOf(cadena);
                if (posVarReserva == -1) {
                    return -1;
                }
                reserva = txtPagina.Substring((posVarReserva + cadena.Length + 10), 10);
                reserva = limpiarReserva(reserva);
                if (!Int32.TryParse(reserva, out notificacionesEmitidasD)) {
                    return -1;
                }
                return notificacionesEmitidasT + notificacionesEmitidasD;
            } catch (Exception ex) {
                LogExcepcion.guardar("Error en navegar en ClienteNotificaciones", ex);
                return -1;
            }
        }

        private string limpiarReserva(string reserva1) {
            int posVarReserva = reserva1.IndexOf("<");
            if (posVarReserva == -1) {
                return reserva1.Trim();
            }
            return reserva1.Substring(0, posVarReserva).Trim();
        }

        private void generarNotificaciones(int notificacionesEmitidas) {
            try {
                string path = @"C:\AEAT\Ateneo\Operador\Productos\Notificaciones.ope";
                using (System.IO.StreamWriter sw = new System.IO.StreamWriter(path, false, Encoding.Default)) {
                    sw.WriteLine(notificacionesEmitidas);
                }
            } catch (Exception ex) {
                LogExcepcion.guardar("Error en generarNotificaciones", ex);
            }
        }
    }
}
