<!DOCTYPE html>
<!--
Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
Click nbfs://nbhost/SystemFileSystem/Templates/Scripting/EmptyPHPWebPage.php to edit this template
-->
<html>
    <head>
        <meta charset="UTF-8">
        <title>Ejercicio 08 - Alejandro De la Huerga</title>
        <style>
            *{
                box-sizing: border-box;
                margin: 0;
            }
            
            header{
                background: lightblue;
                width: 100%;
                height: 15vh;
                display: flex;
                flex-direction: column;
                justify-content: center;
                align-items: center;
            }
            
            main{
                display: flex;
                flex-direction: column;
                align-items: center;
                justify-content: center;
                height: 74vh;
            }
            
            footer{
                display: flex;
                align-items: center;
                justify-content: center;
                width: 100%;
                height: 13vh;
                gap: 30px;
                background: lightblue;
            }
            
            footer img{
                width: 40px;
                height: auto;
            }
        </style>
    </head>
    <body>
        <header>
            <h1>Ejercicio 08 - XML</h1>
            <a href="../indexProyectoTema4.php"><h2>Alejandro De la Huerga</h2></a>
        </header>
       <main>
            <section>
                <?php
                /**
                 * @author: Alejandro De la Huerga
                 * @since 18/11/2025
                 * 
                 *  * Ejercicio 8
                 * Página web que toma datos (código y descripción) de la tabla Departamento y 
                 * guarda en un fichero departamento.xml. (COPIA DE SEGURIDAD / EXPORTAR). El fichero 
                 * exportado se encuentra en el directorio .../tmp/ del servidor.
                  /**
                 * Script para exportar departamentos de la base de datos a un archivo XML
                 * 
                 * Este archivo realiza las siguientes operaciones:
                 * 1. Consulta los departamentos almacenados en la base de datos
                 * 2. Crea un objeto SimpleXMLElement con la estructura XML
                 * 3. Itera sobre los resultados y construye el árbol XML
                 * 4. Guarda el archivo XML generado en el sistema de archivos
                 * 
                 */
                
                //enlace a los datos de conexión
                require_once '../config/confDBPDO.php';

                try {
                    /**
                     * Conexión a la base de datos mediante PDO
                     * Configura el modo de error para lanzar excepciones
                     * 
                     * @var PDO $miDB Objeto de conexión a la base de datos
                     */
                    //Conexion a la base de datos
                    $miDB = new PDO(DNS, USUARIODB, PSWD);
                    $miDB->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                    
                    echo "<h3>Conexión establecida con éxito.</h3>";

                    /**
                     * Consulta SQL para obtener código y descripción de todos los departamentos
                     * 
                     * @var string $sql Sentencia SELECT para recuperar departamentos
                     */
                    //Consulta Preparada
                    $sql = 'SELECT T02_CodDepartamento, T02_DescDepartamento FROM T02_Departamento';

                    /**
                     * Consulta preparada para la selección de departamentos
                     * 
                     * @var PDOStatement $consultaPreparada Statement preparado con la consulta SQL
                     */
                    $consultaPreparada = $miDB->prepare($sql);

                    //Ejecución de la consulta
                    $consultaPreparada->execute();

                    /**
                     * Objeto SimpleXMLElement para construir la estructura XML
                     * Inicializado con la declaración XML y el elemento raíz 'departamentos'
                     * 
                     * @var SimpleXMLElement $xml Objeto que representa el documento XML
                     */
                    //https://www.php.net/manual/es/book.simplexml.php
                    //https://www.w3schools.com/php/php_ref_simplexml.asp
                    //creacion del objeto XML
                    $xml = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><departamentos></departamentos>');

                    /**
                     * Itera sobre cada departamento recuperado de la base de datos
                     * Crea un elemento 'departamento' con sus hijos 'codDpto' y 'descDpto'
                     * 
                     * @var objeto $oDepartamento Objeto con los datos de cada departamento
                     * @var SimpleXMLElement $elemento Elemento XML 'departamento' añadido al árbol
                     */
                    while ($oDepartamento = $consultaPreparada->fetchObject()) {
                        $elemento = $xml->addChild('departamento');
                        $elemento->addChild('codDpto', $oDepartamento->T02_CodDepartamento);
                        $elemento->addChild('descDpto', $oDepartamento->T02_DescDepartamento);
                    }

                    /**
                     * Ruta absoluta donde se guardará el archivo XML generado
                     * 
                     * @var string $rutaFichero Ruta completa del archivo de destino
                     */
                    /*Se guarda el fichero en la carpeta tmp.
                    Es importante que la carpeta tmp tenga permisos de lectura y escritura para que php pueda guardar el fichero departamentos.php
                    para ello se ejecutan estos commandos en el servidor
                    sudo chown -R www-data:www-data /var/www/html/VGDWESProyectoTema4/tmp
                    sudo chmod 775 /var/www/html/VGDWESProyectoTema4/tmp
                    Hay que mirar si el fichero está en la capreta tmp del servidor 
                     porque no se ve en la carpeta tmp de netbeans si no se descarga manualmente
                     */
                    $rutaFichero = '../tmp/departamentos.xml';

                    /**
                     * Guarda el objeto XML como archivo en el sistema de archivos
                     */
                    $xml->asXML($rutaFichero);
                    echo "<p>Ruta generada: $rutaFichero</p>";

                    //Mensaje de confirmación
                    echo "<h3 style='color:blue;'>Exportación completada con éxito.</h3>";
                    echo "<p>El archivo se ha guardado en: <b>{$rutaFichero}</b></p>";
                } catch (PDOException $miExceptionPDO) {
                    /**
                     * Captura errores específicos de PDO durante la conexión o consulta
                     * Muestra información detallada del error de base de datos
                     * 
                     * @var PDOException $miExceptionPDO Excepción lanzada por PDO
                     */
                    // errores de la base de datos.    
                    echo "<h3 style='color:red;'>Error en la base de datos.</h3>";
                    echo "<p><b>Mensaje:</b> " . $miExceptionPDO->getMessage() . "</p>";
                    echo "<p><b>Código:</b> " . $miExceptionPDO->getCode() . "</p>";
                } catch (Exception $miExcepcionGeneral) {
                    /**
                     * Captura cualquier otra excepción no relacionada con PDO
                     * Por ejemplo, errores al crear o guardar el archivo XML
                     * 
                     * @var Exception $miExcepcionGeneral Excepción general capturada
                     */
                    echo "<h3 style='color:red;'>Error general.</h3>";
                    echo "<p><b>Mensaje:</b> " . $miExcepcionGeneral->getMessage() . "</p>";
                } finally {
                    /**
                     * Cierra la conexión a la base de datos
                     * Se ejecuta siempre, independientemente de si hubo errores
                     */
                    unset($miDB); // Cerrar conexión
                }
                ?>
            </section>
        </main>
    </body>
    <footer>
        <a href="../indexProyectoTema3.php">Alejandro De la Huerga Fernández</a>
        <a href="https://github.com/alejandrohuerga/AHFDWESProyectoTema3.git">
            <img src="../doc/images/github-logo.png"> 
        </a>
    </footer> 
</html>