package edu.upvehu.gbg.xml.jaxb;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.File;
import java.util.List;

/**
 * Clase principal para demostrar el uso de JAXB (Java Architecture for XML Binding).
 * 1. Unmarshalling: Lee el archivo XML en un árbol de objetos Java.
 * 2. Manipulación: Modifica los objetos Java.
 * 3. Marshalling: Escribe el árbol de objetos de vuelta a un archivo XML.
 */
public class LectorYEscritorJAXB {

    public static void main(String[] args) {
        // Asegúrate de que este archivo exista en el mismo directorio de ejecución
        final String ARCHIVO_ENTRADA = "chat.xml";
        final String ARCHIVO_SALIDA = "chat_jaxb_modificada.xml";

        try {
            // 1. CONFIGURACIÓN: Crear el contexto JAXB
            // Se inicializa a partir de la clase raíz (ChatApp)
            JAXBContext context = JAXBContext.newInstance(ChatApp.class);
            
            // --- PARTE 1: UNMARSHALLING (XML a Objeto Java) ---
            System.out.println("--- 1. LECTURA (UNMARSHALLING) de " + ARCHIVO_ENTRADA + " ---");
            
            Unmarshaller um = context.createUnmarshaller();
            
            // Crear el objeto File
            File xmlFile = new File(ARCHIVO_ENTRADA);

            // VERIFICACIÓN DE EXISTENCIA DEL ARCHIVO
            if (!xmlFile.exists()) {
                System.err.println("ERROR FATAL: El archivo de entrada '" + ARCHIVO_ENTRADA + "' no se encontró.");
                System.err.println("Asegúrate de que el archivo XML esté en la carpeta de ejecución.");
                return; 
            }

            // Convertir el XML en un objeto ChatApp
            ChatApp chatApp = (ChatApp) um.unmarshal(xmlFile);
            
            // Acceder a los datos como objetos Java normales
            System.out.println("Total de conversaciones leídas: " + chatApp.getConversacion().size());
            
            // Acceder y modificar datos (ejemplo: modificar el texto del último mensaje)
            List<Conversacion> conversaciones = chatApp.getConversacion();
            if (!conversaciones.isEmpty()) {
                Conversacion ultimaConv = conversaciones.get(conversaciones.size() - 1);
                
                if (!ultimaConv.getMensajes().isEmpty()) { 
                    Mensaje ultimoMensaje = ultimaConv.getMensajes().get(ultimaConv.getMensajes().size() - 1);
                    
                    System.out.println("Texto original: \"" + ultimoMensaje.getTexto() + "\"");
                    
                    // Modificación del objeto Java
                    ultimoMensaje.setTexto("Confirmado, estoy en ello (Modificado por JAXB).");
                    chatApp.setExportDate("2025-01-16"); // Cambiar la fecha de exportación
                }
            }
            
            // --- PARTE 2: MARSHALLING (Objeto Java a XML) ---
            System.out.println("\n--- 2. ESCRITURA (MARSHALLING) a " + ARCHIVO_SALIDA + " ---");
            
            Marshaller m = context.createMarshaller();
            
            // Propiedades para formatear el XML de salida
            m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
            m.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
            
            // CORRECCIÓN: Evitar la ubicación del esquema para eliminar el prefijo 'ns2'
            m.setProperty(Marshaller.JAXB_NO_NAMESPACE_SCHEMA_LOCATION, "chat.xsd");
            
            // Escribir el objeto modificado en un nuevo archivo XML
            m.marshal(chatApp, new File(ARCHIVO_SALIDA));
            
            System.out.println("Objeto modificado escrito con éxito en: " + ARCHIVO_SALIDA);
            
        } catch (Exception e) {
            System.err.println("Error procesando XML con JAXB:");
            e.printStackTrace();
        }
    }
}