
import com.fp.frontend.controller.armas.parametros.CentroControlArmasController;
import com.fp.frontend.controller.armas.solicitud.SolicitudController;
import com.fp.frontend.controller.armas.solicitud.SolicitudTramiteController;
import com.fp.frontend.controller.armas.solicitud.TarmTramiteController;
import com.fp.frontend.controller.armas.solicitud.TramiteArmasController;
import com.fp.frontend.controller.armas.solicitud.ValidarDepositoController;
import com.fp.frontend.controller.pcustomer.PersonAddressController;
import com.fp.frontend.controller.pcustomer.PersonDetailController;
import com.fp.frontend.controller.pcustomer.PersonPhoneController;
import com.fp.frontend.controller.pgeneral.gene.CatalogDetailController;
import com.fp.frontend.controller.pgeneral.gene.CityController;
import com.fp.firma.common.CertificateUtils;
import com.fp.frontend.controller.armas.parametros.CashManagementHistoryController;

import com.fp.frontend.controller.pgeneral.gene.ParametersController;
import com.fp.frontend.utility.Utilidades;
import com.fp.persistence.parmas.fun.TarmCashManagementHistory;
import com.fp.persistence.parmas.param.TarmCentroControl;
import com.fp.persistence.parmas.soli.TarmSolicitud;
import com.fp.persistence.parmas.soli.TarmSolicitudTramite;
import com.fp.persistence.parmas.param.TarmTramite;
import com.fp.persistence.pcustomer.gene.TcustPersonAddress;
import com.fp.persistence.pcustomer.gene.TcustPersonDetail;
import com.fp.persistence.pcustomer.gene.TcustPersonPhone;
import com.fp.persistence.pgeneral.gene.TgeneCatalogDetail;
import com.fp.persistence.pgeneral.gene.TgeneCity;
import com.fp.persistence.pgeneral.gene.TgeneParameters;
import com.fp.persistence.pgeneral.safe.TsafeUserDetail;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfSignatureAppearance;
import com.itextpdf.text.pdf.PdfStamper;
import com.itextpdf.text.pdf.security.BouncyCastleDigest;
import com.itextpdf.text.pdf.security.DigestAlgorithms;
import com.itextpdf.text.pdf.security.ExternalDigest;
import com.itextpdf.text.pdf.security.ExternalSignature;
import com.itextpdf.text.pdf.security.MakeSignature;
import com.itextpdf.text.pdf.security.OcspClient;
import com.itextpdf.text.pdf.security.OcspClientBouncyCastle;
import com.itextpdf.text.pdf.security.PrivateKeySignature;
import com.itextpdf.text.pdf.security.TSAClient;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.security.GeneralSecurityException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.cert.CertificateException;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpServletResponse;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.openide.util.Exceptions;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */

/**
 *
 * @author developer2
 */
public class testFactura {
    public static void crearAgregarHijo(Document doc,Element padre, String nombreElemento, String textoElemento){
        Element hijo = crearElemento(doc, nombreElemento, textoElemento);
        agregarHijoPadre(doc, padre, hijo);
    }
    public static void crearAtributo(Document doc,Element elemento, String nombreAtributo, String valorAtributo){
        Attr attr = doc.createAttribute(nombreAtributo);
        attr.setValue(valorAtributo);
        elemento.setAttributeNode(attr);
    }
    public static void crearAgregarHijoAtributo(Document doc,Element padre, String nombreElemento, String textoElemento, String nombreAtributo, String textoAtributo){
        Element hijo = crearElemento(doc, nombreElemento, textoElemento);
        crearAtributo(doc, hijo, nombreAtributo, textoAtributo);
        agregarHijoPadre(doc, padre, hijo);
    }
    public static Element crearElemento(Document doc, String nombreElemento, String textoElemento){
        Element elemento1 = doc.createElement(nombreElemento);
        elemento1.setTextContent(textoElemento);
        return elemento1;
    }
    public static Element crearElementoSinTexto(Document doc, String nombreElemento){
        Element elemento1 = doc.createElement(nombreElemento);
        return elemento1;
    }
    public static void agregarHijoPadre(Document doc,Element padre, Element hijo){
        padre.appendChild(hijo);

    }
    public static void sacarFactura(String codigoSolicitud) throws Exception{
        /** ============================ NO ESTATICAS ===============0*/
        DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
      DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
      //Elemento raíz
        Document doc = docBuilder.newDocument();
        Element factura = doc.createElement("factura");
        PersonAddressController pac = new PersonAddressController();
        
        TarmSolicitudTramite solicitudTramite = SolicitudTramiteController.findByCSolicitud(codigoSolicitud);
        TarmSolicitud solicitud = SolicitudController.findSolicitudxcodsolicitud(codigoSolicitud);
        Integer personCode = solicitud.getPersoncode();
        TcustPersonDetail persona = PersonDetailController.find(personCode.toString());
        TgeneParameters parametroRUC = ParametersController.find("RUCCOMACO", "1");
        TarmTramite tTramite = TarmTramiteController.find(solicitud.getCtramite().toString());
        String rucComaco = parametroRUC.getTextvalue();
        crearAgregarHijo(doc, factura, "ruc", rucComaco);
        crearAgregarHijo(doc, factura, "secuencia", rucComaco);
        
        
        String ccentro = solicitud.getCcentrocontrol();
        TarmCentroControl centroControl = CentroControlArmasController.findPorCentroControl(ccentro);
        
        String claveNombreInstitucion = centroControl.getNombreinstitucion();
        String establecimiento = "001";
        crearAgregarHijo(doc, factura, "serie", establecimiento.concat(centroControl.getPk().substring(2)));

        String nombreInstitucionCodigo = centroControl.getNombreinstitucioncodigo();
        TgeneCatalogDetail nombreInstitucion = CatalogDetailController.findCatalogo(claveNombreInstitucion, nombreInstitucionCodigo);
        
        //Fecha de emision
        SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
        String fechaEmision = sdf.format(Calendar.getInstance().getTime());
        crearAgregarHijo(doc, factura, "fecha", fechaEmision);

        /** ============================= DATOS DE PERSONA ==================================== */
         String tipoDocumento = persona.getIdentificationcatalog();
        String nombre = persona.getName();
        String identificacion = persona.getIdentification();
        crearAgregarHijo(doc, factura, "tipoIdComprador", tipoDocumento);
        crearAgregarHijo(doc, factura, "razonSocialComprador", nombre);
        crearAgregarHijo(doc, factura, "identificacionComprador", identificacion);

        /**Direccion*/
        TcustPersonAddress direccionDomicilio = pac.findByPersonCode(personCode.toString(), "2");
        TcustPersonAddress correo = pac.findByPersonCode(personCode.toString(), "3");
        TcustPersonPhone telefono = PersonPhoneController.find(personCode.toString(), "1");
        Double valorAPagar = solicitudTramite.getValorapagar().doubleValue();
        String cityCode = direccionDomicilio.getCitycode();
        crearAgregarHijo(doc, factura, "direccionComprador", direccionDomicilio.getAddress());
        crearAgregarHijo(doc, factura, "totalSinImpuestos", valorAPagar.toString());
        crearAgregarHijo(doc, factura, "totalDescuento", "0.00");
        /** ==================  impuestoTotal ================*/
        String impuesto = "IVA";
        int porcentajeDescuento = 0;

        Double descuento = 0.00;
        Element impuestoTotal = crearElementoSinTexto(doc, "impuestoTotal");
        Element totalImpuesto1 = crearElementoSinTexto(doc, "totalImpuesto");
        Element totalImpuesto2 = crearElementoSinTexto(doc, "totalImpuesto");

        crearAgregarHijo(doc, totalImpuesto1, "codigo", impuesto);
        crearAgregarHijo(doc, totalImpuesto1, "Porcentaje", porcentajeDescuento+"");
        crearAgregarHijo(doc, totalImpuesto1, "baseImponible", valorAPagar.toString());
        
        crearAgregarHijo(doc, totalImpuesto1, "codigo", impuesto);
        crearAgregarHijo(doc, totalImpuesto1, "Porcentaje", porcentajeDescuento+"");
        crearAgregarHijo(doc, totalImpuesto1, "baseImponible", valorAPagar.toString());

        crearAgregarHijo(doc, totalImpuesto2, "baseImponible", impuesto);
        crearAgregarHijo(doc, totalImpuesto2, "Porcentaje", "12");
        crearAgregarHijo(doc, totalImpuesto2, "baseImponible", valorAPagar.toString());
        agregarHijoPadre(doc, impuestoTotal, totalImpuesto1);
        agregarHijoPadre(doc, impuestoTotal, totalImpuesto2);
        agregarHijoPadre(doc, factura, impuestoTotal);
        crearAgregarHijo(doc, factura, "totalFactura", valorAPagar.toString());
        /** ========================= Detalles ================================*/
        
        // aun no estoy seguro de esos datos
        TgeneCatalogDetail tTipoAutorizacion = CatalogDetailController.findCatalogo(tTramite.getTipoautorizacion(), tTramite.getTipoautorizacioncodigo());

        String codigoPrincipal = codigoSolicitud;
        String descripcion = tTipoAutorizacion.getDescription();
        int cantidad = 1;
        Double precioUnitario = solicitudTramite.getValortramitearmas().doubleValue();
        Double precioTotalSinImpuestos = precioUnitario * cantidad;
        Element detalles = crearElementoSinTexto(doc, "detalles");
        Element detalle1 = crearElementoSinTexto(doc, "detalle");
        crearAgregarHijo(doc, detalle1, "codigoPrincipal", codigoPrincipal);
        crearAgregarHijo(doc, detalle1, "descripcion", descripcion);
        crearAgregarHijo(doc, detalle1, "cantidad", cantidad+"");
        crearAgregarHijo(doc, detalle1, "precioUnitario", precioUnitario.toString());
        crearAgregarHijo(doc, detalle1, "descuento", "0.00");
        crearAgregarHijo(doc, detalle1, "precioTotalSinImpuesto", precioTotalSinImpuestos.toString());
        
        Element impuestoItem = crearElementoSinTexto(doc, "impuestoItem");
        Element impueste = crearElementoSinTexto(doc, "impuesto");
        /** >>>>>>>AQUI NOS QUEDAMOS<<<<<<<*/
        /**==== impuesto item == */
                crearAgregarHijo(doc, impueste, "impuesto", impuesto);
                crearAgregarHijo(doc, impueste, "Porcentaje", porcentajeDescuento+"");
                crearAgregarHijo(doc, impueste, "baseImponible", precioTotalSinImpuestos+"");
                agregarHijoPadre(doc, impuestoItem, impueste);
                agregarHijoPadre(doc, detalle1, impuestoItem);
                agregarHijoPadre(doc, detalles, detalle1);
                String porcentaje = "0";
                Double baseImponible = precioTotalSinImpuestos;
        /** ====custodios */

        if(solicitudTramite.getValorcustodios() != null && solicitudTramite.getValorcustodios().doubleValue() > 0){
            Element detalle2 = crearElementoSinTexto(doc, "detalle");
            String codigoPrincipal2 = "1"; /**no tengo la menor idea*/
            String descripcion2 = "CUSTODIO";
            Double precioUnitario2 = solicitudTramite.getValorcustodios().doubleValue();
            Double precioTotalSinImpuestos2 = precioUnitario * cantidad;
            
            crearAgregarHijo(doc, detalle2, "codigoPrincipal", codigoPrincipal2);
            crearAgregarHijo(doc, detalle2, "descripcion", descripcion2);
            crearAgregarHijo(doc, detalle2, "cantidad", cantidad+"");
            crearAgregarHijo(doc, detalle2, "precioUnitario", precioUnitario2.toString());
            crearAgregarHijo(doc, detalle2, "descuento", "0.00");
            crearAgregarHijo(doc, detalle2, "precioTotalSinImpuesto", precioTotalSinImpuestos2.toString());
            
            Element impuestoItem2 = crearElementoSinTexto(doc, "impuestoItem");
            Element impueste2 = crearElementoSinTexto(doc, "impuesto");
                crearAgregarHijo(doc, impueste2, "impuesto", impuesto);
                crearAgregarHijo(doc, impueste2, "Porcentaje", porcentajeDescuento+"");
                crearAgregarHijo(doc, impueste2, "baseImponible", precioTotalSinImpuestos2.toString());
                agregarHijoPadre(doc, impuestoItem2, impueste2);
                agregarHijoPadre(doc, detalle2, impuestoItem2);
                agregarHijoPadre(doc, detalles, detalle2);
                agregarHijoPadre(doc, factura, detalles);
        }
        
                
        /** ========================= Pagos ================================*/
        Element pagos = crearElementoSinTexto(doc, "pagos");

        Element pago = crearElementoSinTexto(doc, "pago");
        String formaPago = "EF"; /** de momento, tocaria ver los nemonicos a futuro para pago 
         con tarjeta*/
        Double totalPagar = valorAPagar;
        crearAgregarHijo(doc, pago, "formaPago", formaPago);
        crearAgregarHijo(doc, pago, "total", totalPagar.toString());
        agregarHijoPadre(doc, pagos, pago);
        agregarHijoPadre(doc, factura, pagos);
        /** ========================= INFOAdicional ========================*/
        String mail = correo.getAddress();
        String telefonoFijo = telefono.getPhonenumber();
        TgeneCity Tciudad = CityController.findOnlyOne(direccionDomicilio.getCountrycode(), 
            direccionDomicilio.getProvincecode(), direccionDomicilio.getCantoncode(), direccionDomicilio.getCitycode());
        String ciudad = Tciudad.getDescription();
        
        Element infoAdicional = crearElementoSinTexto(doc, "infoAdicional");
        crearAgregarHijoAtributo(doc, infoAdicional, "campoAdicional", mail, "nombre", "Mail");
        crearAgregarHijoAtributo(doc, infoAdicional, "campoAdicional", telefonoFijo, "nombre", "Telefono");
        crearAgregarHijoAtributo(doc, infoAdicional, "campoAdicional", ciudad, "nombre", "Ciudad");
        //Se escribe el contenido del XML en un archivo
      TransformerFactory transformerFactory = TransformerFactory.newInstance();
      Transformer transformer = transformerFactory.newTransformer();
      DOMSource source = new DOMSource(doc);
      StreamResult result = new StreamResult(new File("/home/developer2/data/Facturacion/prueba.xml"));
    }   
    
    public static void correrClase(){
        try {
            String codigoSolicitud = "1715";
            sacarFactura(codigoSolicitud);
        } catch (Exception ex) {
            Exceptions.printStackTrace(ex);
        }
        
    }
    /**
     * Arma la petici&oacute;n al core para solicitar un n&uacute;mero de
     * secuencial para la solicitud antes de guardarla
     *
     * @throws Throwable
     */
   
    public static void main(String[] args) {
        //correrClase();
        Map<String,String> sexo = new HashMap();
        sexo.put("uno", "uno");
        sexo.put("dos", "dos");
        System.out.println("Prueba > "+sexo.get("uno"));
        System.out.println("Prueba > "+sexo.get("tres"));
      /**  Scanner sc = new Scanner(new InputStreamReader(System.in));
        System.out.println("Ingrese un numero: ");
        int value1= sc.nextInt();
        System.out.println("Ingrese un numero: ");
        int value2= sc.nextInt();
        System.out.println("La suma de los dos numeros es:" +(value1+value2));      */
    }
    
    /**
     * TEST FIRMA
     */
    /**
    public void firmaAccion(){
        // TODO add your handling code here:
        InputStream inputStream = null;
        try{
            String pathPDF = "/home/developer2/data/actaRecepciondeArmas.pdf";
            String tipoFirma="1";
             String razon =  "rison is yu";
             String lugar = "lugar";
             String nombreFirma = "";
             String password ="password";
             Float llx =  0.0F;
             Float lly =  0.0F;
             Float urx =  0.0F;
             Float ury =  0.0F;
            if(tipoFirma == null){
                JOptionPane.showMessageDialog(null, "Debe seleccionar un Token con el cual firmar", "Tipo Firma", JOptionPane.ERROR_MESSAGE);
                return;
            }
            if(pathPDF != null){
                //final JComponent[] components = new JComponent[]{new JLabel("Password:"), txtPasswordToken};
                //JOptionPane.showMessageDialog(null, components, "TOKEN", JOptionPane.PLAIN_MESSAGE);
                if(password == null){
                	throw new NullPointerException("Error en FIR-0007: Password nulo");
                }
                inputStream = new FileInputStream(pathPDF);
                byte[] datos = CertificateUtils.sign(inputStream, null, new String(txtPasswordToken.getPassword()), razon, lugar, Boolean.FALSE.booleanValue(), Boolean.FALSE.booleanValue(), new Rectangle(llx.floatValue(), lly.floatValue(), urx.floatValue(), ury.floatValue()), 1, nombreFirma, this.tipoFirma);
                if(datos != null){
	                escribirArchivo(datos);
	                txtPasswordToken.setText("");
	                JOptionPane.showMessageDialog(null, "El archivo se modificado correctamente", "Archivo firmado", JOptionPane.INFORMATION_MESSAGE);
                }
            }else{
                JOptionPane.showMessageDialog(null, "Debe seleccionar un archivo", "Archivo no encontrado", JOptionPane.ERROR_MESSAGE);
            }
            btnFirmarArchivo.setEnabled(false);
            btnExaminar.setEnabled(false);
        } catch(IOException e){
            JOptionPane.showMessageDialog(null, e.getMessage(), "IO Error", JOptionPane.ERROR_MESSAGE);
        } catch(Exception e){
            JOptionPane.showMessageDialog(null, e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
        } finally{
            try {
                if(inputStream != null){
                    inputStream.close();
                }
            } catch (IOException ex) {
                Logger.getLogger(FirmaApplet.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    
    }
    */
    /**
     * *Firmar
     
     */
    
    
    
    
}
