<?php
/*
 * descarregar_orla.php
 * ─────────────────────────────────────────────────────────────
 * Empaqueta tota l'orla (index.html, videos.js, carpeta videos/
 * i — si existeix — la carpeta germana ORLAS_2024/images/) en
 * un fitxer ZIP que es serveix com a descàrrega.
 *
 * Estructura del ZIP (dues carpetes germanes a l'arrel, igual
 * que estan al servidor, perquè index.html troba el logo amb
 * la ruta relativa "../ORLAS_2024/images/logo.png"):
 *
 *   orla-digital/
 *     index.html
 *     videos.js
 *     generar_videos.php
 *     descarregar_orla.php
 *     videos/...
 *   ORLAS_2024/
 *     images/logo.png
 *
 *   ?dry=1   → no envia el ZIP, només mostra la llista de
 *              fitxers que s'hi inclourien.
 * ─────────────────────────────────────────────────────────────
 */

$base       = __DIR__;
$baseName   = basename($base);                // "orlas" → s'usarà com a "orla-digital" al ZIP
$baseParent = dirname($base);                 // carpeta on viuen tant "orlas" com "ORLAS_2024"
$dryRun     = isset($_GET['dry']) && $_GET['dry'] !== '0';

/* Carpeta arrel dins del ZIP per al projecte. Mantenim el nom
 * de la carpeta original perquè qualsevol enllaç relatiu que
 * pugi ("../ORLAS_2024/...") segueixi funcionant un cop
 * descomprimit l'arxiu. */
$rootProjecte = $baseName;

if (!class_exists('ZipArchive')) {
    http_response_code(500);
    header('Content-Type: text/plain; charset=utf-8');
    echo "Error: l'extensió ZipArchive de PHP no està disponible al servidor.";
    exit;
}

/* Llista de fitxers/carpetes a incloure (relatius a $base) */
$inclou = [
    'index.html',
    'videos.js',
    'generar_videos.php',
    'descarregar_orla.php',
    'CLAUDE.md',
    'videos',                  // carpeta sencera
    '../ORLAS_2024/images',    // logo (carpeta germana)
];

/**
 * Calcula la ruta dins del ZIP per a un fitxer absolut.
 * - Si el fitxer viu dins de $base, va sota "$rootProjecte/...".
 * - Si viu sota el pare de $base (cas del logo a ../ORLAS_2024/...),
 *   es desa a l'arrel del ZIP preservant la jerarquia, de manera
 *   que un cop descomprimit quedi com a carpeta germana de
 *   $rootProjecte i les rutes "../..." segueixin funcionant.
 */
function nomDinsZip($abs, $base, $baseParent, $rootProjecte) {
    $abs        = str_replace('\\', '/', $abs);
    $base       = rtrim(str_replace('\\', '/', $base), '/');
    $baseParent = rtrim(str_replace('\\', '/', $baseParent), '/');

    if (strncmp($abs, $base . '/', strlen($base) + 1) === 0) {
        return $rootProjecte . '/' . substr($abs, strlen($base) + 1);
    }
    if (strncmp($abs, $baseParent . '/', strlen($baseParent) + 1) === 0) {
        return substr($abs, strlen($baseParent) + 1);
    }
    // Fallback (no hauria de passar): només el basename
    return basename($abs);
}

/* ── Recollir la llista real de fitxers ─────────────────── */
$fitxers = [];   // [ rutaAbsoluta => rutaDinsDelZip ]

foreach ($inclou as $rel) {
    $abs = realpath($base . DIRECTORY_SEPARATOR . $rel);
    if ($abs === false) continue;

    if (is_file($abs)) {
        $fitxers[$abs] = nomDinsZip($abs, $base, $baseParent, $rootProjecte);
        continue;
    }

    if (is_dir($abs)) {
        $it = new RecursiveIteratorIterator(
            new RecursiveDirectoryIterator($abs, FilesystemIterator::SKIP_DOTS),
            RecursiveIteratorIterator::LEAVES_ONLY
        );
        foreach ($it as $f) {
            if (!$f->isFile()) continue;
            $real = $f->getRealPath();
            $fitxers[$real] = nomDinsZip($real, $base, $baseParent, $rootProjecte);
        }
    }
}

if (count($fitxers) === 0) {
    http_response_code(500);
    header('Content-Type: text/plain; charset=utf-8');
    echo "Error: no s'ha trobat cap fitxer per empaquetar.";
    exit;
}

/* ── DRY RUN: només llistat ─────────────────────────────── */
if ($dryRun) {
    header('Content-Type: text/plain; charset=utf-8');
    echo "[DRY RUN] " . count($fitxers) . " fitxers s'inclourien al ZIP:\n\n";
    foreach ($fitxers as $abs => $dins) {
        echo $dins . "   ←   " . $abs . "\n";
    }
    exit;
}

/* ── Crear el ZIP en un fitxer temporal ─────────────────── */
$tmp = tempnam(sys_get_temp_dir(), 'orla_zip_');
if ($tmp === false) {
    http_response_code(500);
    header('Content-Type: text/plain; charset=utf-8');
    echo "Error: no s'ha pogut crear el fitxer temporal.";
    exit;
}

$zip = new ZipArchive();
if ($zip->open($tmp, ZipArchive::CREATE | ZipArchive::OVERWRITE) !== true) {
    @unlink($tmp);
    http_response_code(500);
    header('Content-Type: text/plain; charset=utf-8');
    echo "Error: no s'ha pogut obrir el ZIP per escriure.";
    exit;
}

foreach ($fitxers as $abs => $dins) {
    $zip->addFile($abs, $dins);
}
$zip->close();

/* ── Servir el ZIP ──────────────────────────────────────── */
$nomFitxer = 'orla-digital-' . date('Y-m-d') . '.zip';

// Netejar qualsevol buffer obert que pogués corrompre el binari
while (ob_get_level() > 0) ob_end_clean();

header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename="' . $nomFitxer . '"');
header('Content-Length: ' . filesize($tmp));
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Pragma: no-cache');

readfile($tmp);
@unlink($tmp);
