namespace GMLL00ImportadorXsd.Utilidades.Corp.Wcf.Listadoss
{
    using System.ServiceModel;
    using System.Text;
    using WCorpListados;

    internal sealed class Listados : WcfBase<IWCorpListadosChannel>
    {
        public Listados(string ficheroConfiguracion)
            : base(ficheroConfiguracion)
        {
        }

        public int ObtenerNumeroPaginasPdf(string nombreFicheroPdf)
        {
            int numeroPaginas;

            const string MensajeErrorGenerico = "Ocurrió un error al invocar WCorpListados.fintNumPagPDF.";

            var canal = CrearCanal();

            try
            {
                numeroPaginas = canal.fintNumPagPDF(nombreFicheroPdf);
                canal.Close();
            }
            catch (FaultException<ValidationFault> ex)
            {
                canal.Abort();

                var informacionError = new StringBuilder(MensajeErrorGenerico);

                foreach (ValidationDetail detail in ex.Detail.Details)
                {
                    informacionError
                        .AppendLine()
                        .AppendFormat("Detalle: {0}", detail.Message);
                }

                throw new FaultException(informacionError.ToString());
            }
            catch (FaultException<ExceptionFault> ex)
            {
                canal.Abort();

                var informacionError = new StringBuilder(MensajeErrorGenerico)
                    .AppendLine()
                    .AppendFormat("Error = {0}", ex.Detail.intError).AppendLine()
                    .AppendFormat("MensajeError = {0}", ex.Detail.strError)
                    .ToString();

                throw new FaultException(informacionError);
            }
            catch
            {
                canal.Abort();
                throw;
            }

            return numeroPaginas;
        }

        public byte[] ProcesarLote(string lote)
        {
            byte[] pdf;

            const string MensajeErrorGenerico = "Ocurrió un error al invocar WCorpListados.fProcesarLote.";

            var canal = CrearCanal();

            try
            {
                pdf = canal.fProcesarLote(lote);
                canal.Close();
            }
            catch (FaultException<ValidationFault> ex)
            {
                canal.Abort();

                var informacionError = new StringBuilder(MensajeErrorGenerico);

                foreach (ValidationDetail detail in ex.Detail.Details)
                {
                    informacionError
                        .AppendLine()
                        .AppendFormat("Detalle: {0}", detail.Message);
                }

                throw new FaultException(informacionError.ToString());
            }
            catch (FaultException<ExceptionFault> ex)
            {
                canal.Abort();

                var informacionError = new StringBuilder(MensajeErrorGenerico)
                    .AppendLine()
                    .AppendFormat("Error = {0}", ex.Detail.intError).AppendLine()
                    .AppendFormat("MensajeError = {0}", ex.Detail.strError)
                    .ToString();

                throw new FaultException(informacionError);
            }
            catch
            {
                canal.Abort();
                throw;
            }

            return pdf;
        }
    }
}