namespace GMLL00ImportadorXsd.Utilidades
{
    using System.Globalization;
    using System.Xml; 
    using Corp.Wcf.Listadoss;

    public sealed class Listado
    {
        private readonly XmlDocument documentoXml;
        private readonly XmlElement nodoRaizXml;

        private readonly string ficheroConfiguracionWCorListados;

        public Listado(string ficheroConfiguracionWCorListados)
        {
            this.ficheroConfiguracionWCorListados = ficheroConfiguracionWCorListados;

            this.documentoXml = new XmlDocument();

            XmlDeclaration declaracionXml = this.documentoXml.CreateXmlDeclaration("1.0", null, null);
            this.documentoXml.AppendChild(declaracionXml);

            this.nodoRaizXml = this.documentoXml.CreateElement("documento");
            this.nodoRaizXml.SetAttribute("xmlns", "CORPLISTADOS.xsd");
            this.documentoXml.AppendChild(this.nodoRaizXml);

            XmlElement xmlCrear = this.documentoXml.CreateElement("call");
            xmlCrear.SetAttribute("metodo", "fbolCrearPDFMontaje");
            this.nodoRaizXml.AppendChild(xmlCrear);
        }

        public byte[] ObtenerPdf()
        {
            return Helper.ProcesarLote(this.ficheroConfiguracionWCorListados, this.documentoXml.InnerXml);
        }

        public void CerrarPdfMontaje()
        {
            XmlElement xmlCrear = this.documentoXml.CreateElement("call");
            xmlCrear.SetAttribute("metodo", "fCerrarPDFMontaje");
            this.nodoRaizXml.AppendChild(xmlCrear);
        }

        /// <summary>
        /// Método que escribe un texto en la posición indicada
        /// </summary>
        /// <param name="pfltX">Coordenada X del texto</param>
        /// <param name="pfltY">Coordenada Y del texto</param>
        /// <param name="pstrTexto">Texto a escribir</param>
        public void EscribirLinea(float pfltX, float pfltY, string pstrTexto)
        {
            XmlElement elementoXml = this.documentoXml.CreateElement("call");
            elementoXml.SetAttribute("metodo", "fEscribirLinea");
            elementoXml.SetAttribute("pfloX", pfltX.ToString(CultureInfo.InvariantCulture));
            elementoXml.SetAttribute("pfloY", pfltY.ToString(CultureInfo.InvariantCulture));
            elementoXml.SetAttribute("pstrTexto", pstrTexto);
            this.nodoRaizXml.AppendChild(elementoXml);
        }

        /// <summary>
        /// Método que establece una fuente predeterminada
        /// </summary>
        /// <param name="pstrTipo">Tipo</param>
        /// <param name="tamanio">Tamaño</param>
        /// <param name="pstrColor">Color</param>
        public void SetPdfFont(string pstrTipo, int tamanio, string pstrColor)
        {
            XmlElement elementoXml = this.documentoXml.CreateElement("call");
            elementoXml.SetAttribute("metodo", "SetPdfFont");
            elementoXml.SetAttribute("pstrFont", pstrTipo);
            elementoXml.SetAttribute("pintTamLetra", tamanio.ToString(CultureInfo.InvariantCulture));
            elementoXml.SetAttribute("pstrColor", pstrColor);
            this.nodoRaizXml.AppendChild(elementoXml);
        }

        /// <summary>
        /// Método que asigna la orientación del PDF
        /// </summary>
        /// <param name="pstrOrientacion">Orientación del documento 'H' o 'V'</param>
        public void SetPdfOrientacion(string pstrOrientacion)
        {
            XmlElement elementoXml = this.documentoXml.CreateElement("call");
            elementoXml.SetAttribute("metodo", "SETPDFORIENTACION");
            elementoXml.SetAttribute("pstrPdfOrientacion", pstrOrientacion);
            this.nodoRaizXml.AppendChild(elementoXml);
        }

        public void InsertarPlantilla(string pstrRuta)
        {
            XmlElement xmlInsertarPlantilla = this.documentoXml.CreateElement("call");
            xmlInsertarPlantilla.SetAttribute("metodo", "fInsertarPlantilla");
            xmlInsertarPlantilla.SetAttribute("pFileName", pstrRuta);
            this.nodoRaizXml.AppendChild(xmlInsertarPlantilla);
        }
        
        /// <summary>
        /// Método que agrega una nueva pagina al pdf
        /// </summary>
        public void AgregarPaginaAPdf()
        {
            XmlElement elementoXml = this.documentoXml.CreateElement("call");
            elementoXml.SetAttribute("metodo", "fAgregarPaginaA_PDF");
            ////elementoXML.SetAttribute("pbolTopDown", pbolTopDown.ToString());
            this.nodoRaizXml.AppendChild(elementoXml);
        }
        
        /// <summary>
        /// Método que cierra una página PDF
        /// </summary>
        public void CerrarPaginaPdf()
        {
            XmlElement elementoXml = this.documentoXml.CreateElement("call");
            elementoXml.SetAttribute("metodo", "fCerrarPagina_PDF");
            this.nodoRaizXml.AppendChild(elementoXml);
        }
    }
}
