
package datos;

import encapsuladores.CabeceraFactura;
import encapsuladores.LineaFactura;
import encapsuladores.Mensaje;
import encapsuladores.SistemaArchivos;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;

public class FacturaXML {
    
// --------------------------------------  L E E R   X M L  --------------------------------------------
    
    public void leerXML(Object[] datosFactura, SistemaArchivos sistemaArchivos) throws Exception {
                 
        Mensaje mensaje = (Mensaje) datosFactura[0];
        
        Document document = new SAXBuilder().build(new InputStreamReader(new FileInputStream(new File(sistemaArchivos.getRutaDescarga() + mensaje.getNombreFicheroAdjunto())), StandardCharsets.ISO_8859_1));
                     
        Element raiz = document.getRootElement();
           
        datosFactura[1] = leerCabeceraFactura(raiz);
        datosFactura[2] = leerLineasFactura(raiz);    
    }
    
    
    private CabeceraFactura leerCabeceraFactura(Element raiz){
        
        CabeceraFactura cabeceraFactura = new CabeceraFactura();          
        
        Element cabecera = raiz.getChild("CABECERA");
         
        cabeceraFactura.setNumeroFactura(Integer.parseInt(cabecera.getAttributeValue("numFactura")));
                   
        Element fecha = cabecera.getChild("FECHA");
        String fechaFactura = fecha.getText();
        cabeceraFactura.setFechaFactura( java.sql.Date.valueOf( fechaFactura.substring(6, 10)+"-"+fechaFactura.substring(3, 5)+"-"+fechaFactura.substring(0, 2) ) );
        
        Element cliente = cabecera.getChild("CLIENTE");
        
        cabeceraFactura.setNIFCliente(cliente.getChild("NIF").getText());
        cabeceraFactura.setNombreCliente(cliente.getChild("NOMBRE").getText());
        cabeceraFactura.setDireccionCliente(cliente.getChild("DIRECCION").getText());              
        cabeceraFactura.setPoblacionCliente(cliente.getChild("POBLACION").getText());

        return cabeceraFactura;
    } 
    
    
    private List<LineaFactura> leerLineasFactura(Element raiz){
        
        List<LineaFactura> listaLineasFactura = new ArrayList();
        
        Element lineas = raiz.getChild("LINEAS");         
        List listaLineas = lineas.getChildren("LINEA");
        Iterator iteratorLineas = listaLineas.iterator(); 
        while (iteratorLineas.hasNext())
          {                     
            LineaFactura lineaFactura = new LineaFactura();  
            Element linea = (Element)iteratorLineas.next(); 
            
            lineaFactura.setReferenciaArticulo(linea.getChild("REFERENCIA").getText());
            lineaFactura.setDescripcion(linea.getChild("DESCRIPCION").getText());
            lineaFactura.setPrecioUnitario(Double.parseDouble(linea.getChild("PRECIO").getText()));
            lineaFactura.setUnidades(Integer.parseInt(linea.getChild("UNIDADES").getText()));
            listaLineasFactura.add(lineaFactura);
          }        
        
        return listaLineasFactura;
    }    
        
// --------------------------------------  G E N E R A R   X M L  --------------------------------------
    
    public void generarXML(Object[] datosGenerarFactura) throws IOException {     
                                 // datosGenerarFactura[0] -->> nombreArchivoXML
                                 // datosGenerarFactura[1] -->> cabeceraFactura          instanciado en   FacturaXML().leerXML()
                                 // datosGenerarFactura[2] -->> listaLineasFactura       instanciado en   FacturaXML().leerXML()          
        Element raiz = new Element("FACTURA");
        
        escribirCabeceraFactura(raiz, datosGenerarFactura);
        escribirLineasFactura(raiz, datosGenerarFactura);                                     
        
        Document document = new Document(raiz); 

        Format format = Format.getPrettyFormat();
        format.setEncoding("ISO_8859_1"); 
        format.setIndent("          ");                        
        new XMLOutputter(format).output(document, new OutputStreamWriter(new FileOutputStream(new File((String)datosGenerarFactura[0])) , StandardCharsets.ISO_8859_1));                                                            //   nombre del archivo XML        
        // new XMLOutputter().output(document, System.out);                
    }
    
    
    private void escribirCabeceraFactura(Element raiz, Object[] datosGenerarFactura){
        
        CabeceraFactura cabeceraFactura = (CabeceraFactura)datosGenerarFactura[1];
        List<LineaFactura> listaLineasFactura = (List<LineaFactura>) datosGenerarFactura[2];
        
        Element cabecera = new Element("CABECERA");
        cabecera.setAttribute("numFactura", new Integer(cabeceraFactura.getNumeroFactura()).toString());
        raiz.addContent(cabecera);
        
        Element fechaFactura = new Element("FECHA");
        fechaFactura.setText(new SimpleDateFormat("dd/MM/yyyy").format(cabeceraFactura.getFechaFactura()));
        cabecera.addContent(fechaFactura);
  
        Element datosCliente = new Element("CLIENTE");
        cabecera.addContent(datosCliente);
        
        Element NIFCliente = new Element("NIF");
        NIFCliente.setText(cabeceraFactura.getNIFCliente());
        datosCliente.addContent(NIFCliente);
        
        Element nombreCliente = new Element("NOMBRE");
        nombreCliente.setText(cabeceraFactura.getNombreCliente());
        datosCliente.addContent(nombreCliente);

        Element direccionCliente = new Element("DIRECCION");
        direccionCliente.setText(cabeceraFactura.getDireccionCliente());
        datosCliente.addContent(direccionCliente);        
        
        Element poblacionCliente = new Element("POBLACION");
        poblacionCliente.setText(cabeceraFactura.getPoblacionCliente());
        datosCliente.addContent(poblacionCliente);        
                
        Element importesPieFactura = new Element("PIE");
        cabecera.addContent(importesPieFactura);
        
        Element brutoFactura = new Element("BRUTO");
        brutoFactura.setText(Double.toString(cabeceraFactura.getBrutoFactura(listaLineasFactura)));      
        importesPieFactura.addContent(brutoFactura);         
                
        Element IVA = new Element("IVA");
        IVA.setText(Byte.toString(cabeceraFactura.getIVA())+"%");
        importesPieFactura.addContent(IVA); 
                                                                                   
        Element importeIVA = new Element("IMPORTEIVA");
        importeIVA.setText(Double.toString(cabeceraFactura.getImporteIVA(listaLineasFactura)));
        importesPieFactura.addContent(importeIVA);         
        
        Element liquidoFactura = new Element("LIQUIDO");
        liquidoFactura.setText(Double.toString(cabeceraFactura.getLiquidoFactura(listaLineasFactura)));
        importesPieFactura.addContent(liquidoFactura);                        
    }   
    
    
    private void escribirLineasFactura(Element raiz, Object[] datosGenerarFactura){
        
        List<LineaFactura> listaLineasFactura = (List<LineaFactura>) datosGenerarFactura[2];
        
        Element lineas = new Element("LINEAS");
        raiz.addContent(lineas);
        
        Element linea;
        Element referenciaArticulo;
        Element descripcion;
        Element precioUnitario;
        Element unidades;
        Element importeLinea;
                
        LineaFactura lineaFactura;    
        for (int i=0; i<listaLineasFactura.size(); i++){   
            lineaFactura = listaLineasFactura.get(i);
            
            linea = new Element("LINEA");
            lineas.addContent(linea);
            
            referenciaArticulo = new Element("REFERENCIA");
            referenciaArticulo.setText(lineaFactura.getReferenciaArticulo());
            linea.addContent(referenciaArticulo);
            
            descripcion = new Element("DESCRIPCION");
            descripcion.setText(lineaFactura.getDescripcion());
            linea.addContent(descripcion);
                        
            precioUnitario = new Element("PRECIO");
            precioUnitario.setText( Double.toString(lineaFactura.getPrecioUnitario()) ); 
            linea.addContent(precioUnitario);
            
            unidades = new Element("UNIDADES");
            unidades.setText( Integer.toString(lineaFactura.getUnidades()) );
            linea.addContent(unidades);

            importeLinea = new Element("IMPORTE");
            importeLinea.setText( Double.toString(lineaFactura.getImporteLinea()) );
            linea.addContent(importeLinea);            
        }                
    }     
}

