package edu.upvehu.gbg.xml;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Clase de ejemplo para la generación de un documento XML
 * utilizando el Document Object Model (DOM) en Java.
 * Este método carga todo el documento en memoria para su construcción.
 */
public class GeneradorXMLDOM {

    public static void main(String[] args) {
        final String NOMBRE_ARCHIVO = "conversacion_generada.xml";
        try {
            // 1. Inicialización de las fábricas y el constructor
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document doc = builder.newDocument();

            // 2. Creación del elemento raíz <chatApp>
            Element root = doc.createElement("chatApp");
            String fechaExportacion = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
            root.setAttribute("exportDate", fechaExportacion);
            doc.appendChild(root);

            // 3. Creación y anidación de la primera conversación
            Element conversacion1 = doc.createElement("conversacion");
            conversacion1.setAttribute("id", "c003");
            conversacion1.setAttribute("contacto", "Marta Pérez (Soporte)");
            root.appendChild(conversacion1);
            
            // 4. Creación del primer mensaje
            Element mensaje1 = doc.createElement("mensaje");
            mensaje1.setAttribute("id", "m301");
            mensaje1.setAttribute("remitente", "Yo");
            mensaje1.setAttribute("fecha", "2025-01-16");
            mensaje1.setAttribute("hora", "10:00:00");
            conversacion1.appendChild(mensaje1);
            
            // 5. Añadir contenido de texto al mensaje
            Element texto1 = doc.createElement("texto");
            texto1.appendChild(doc.createTextNode("Necesito ayuda con la configuración."));
            mensaje1.appendChild(texto1);
            
            // 6. Añadir elemento vacío <adjunto>
            Element adjunto1 = doc.createElement("adjunto");
            adjunto1.setAttribute("tipo", "captura");
            mensaje1.appendChild(adjunto1);

            // 7. Escribir el Document a un archivo
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            
            // Opciones de formato (indentación)
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
            transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
            
            DOMSource source = new DOMSource(doc);
            StreamResult result = new StreamResult(new File(NOMBRE_ARCHIVO));
            
            transformer.transform(source, result);

            System.out.println("Documento XML generado con éxito en: " + NOMBRE_ARCHIVO);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
