package edu.upvehu.gbg.xml;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import java.io.File;

/**
 * Clase de ejemplo para leer y procesar un documento XML
 * utilizando el Document Object Model (DOM) en Java.
 * Este modelo carga todo el documento en memoria como un árbol de nodos.
 */
public class LectorXMLDOM {

    public static void main(String[] args) {
//        final String NOMBRE_ARCHIVO = "conversacion.xml";
        final String NOMBRE_ARCHIVO = "conversacion_DTD.xml";
        try {
            // 1. Inicialización de las fábricas y el constructor
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            
            // 2. Parsear el archivo: el documento completo se carga en la memoria
            Document document = builder.parse(new File(NOMBRE_ARCHIVO));
            
            // Opcional pero recomendado: normalizar el documento
            document.getDocumentElement().normalize();

            System.out.println("--- Procesando " + NOMBRE_ARCHIVO + " con DOM ---");
            
            // 3. Obtener todas las conversaciones
            NodeList listaConversaciones = document.getElementsByTagName("conversacion");
            
            System.out.println("Total de conversaciones encontradas: " + listaConversaciones.getLength());
            
            // 4. Iterar sobre la lista de conversaciones
            for (int i = 0; i < listaConversaciones.getLength(); i++) {
                Node nodoConversacion = listaConversaciones.item(i);
                
                if (nodoConversacion.getNodeType() == Node.ELEMENT_NODE) {
                    Element conversacion = (Element) nodoConversacion;
                    
                    String idConv = conversacion.getAttribute("id");
                    String contacto = conversacion.getAttribute("contacto");
                    System.out.printf("\n[CONVERSACIÓN %s] con %s\n", idConv, contacto);

                    // 5. Obtener todos los mensajes dentro de esta conversación
                    NodeList listaMensajes = conversacion.getElementsByTagName("mensaje");
                    
                    // 6. Iterar sobre los mensajes
                    for (int j = 0; j < listaMensajes.getLength(); j++) {
                        Node nodoMensaje = listaMensajes.item(j);
                        if (nodoMensaje.getNodeType() == Node.ELEMENT_NODE) {
                            Element mensaje = (Element) nodoMensaje;
                            
                            // Acceso aleatorio a atributos y sub-elementos
                            String remitente = mensaje.getAttribute("remitente");
                            
                            // Obtener el contenido del sub-elemento <texto>
                            // Usamos getElementsByTagName(texto) y luego item(0) para el primer resultado
                            String textoContenido = mensaje.getElementsByTagName("texto").item(0).getTextContent();
                            
                            System.out.printf("  [%s] -> %s\n", remitente, textoContenido);
                        }
                    }
                }
            }
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
