<?php
/**
 * pages/aviso.php — Vista pública de un aviso.
 * URL: pages/aviso.php?id=X
 */
require_once __DIR__ . '/../config/conn.php';

$id = (int)($_GET['id'] ?? 0);
if (!$id) {
    header('Location: ../index.php');
    exit;
}

// Solo avisos publicados con fecha <= hoy
$stmt = $conn->prepare(
    "SELECT * FROM av_avisos
     WHERE id = ? AND estado = 'publicado' AND fecha_publicacion <= CURDATE()
     LIMIT 1"
);
$stmt->bind_param('i', $id);
$stmt->execute();
$aviso = $stmt->get_result()->fetch_assoc();
$stmt->close();

if (!$aviso) {
    header('HTTP/1.1 404 Not Found');
    $page_title = 'Aviso no encontrado';
    $meta_desc  = '';
    $current_page = '';
    require_once __DIR__ . '/../includes/banner.php';
    require_once __DIR__ . '/../includes/navbar.php';
    echo '<div class="doc-shell"><div class="doc-paper" style="text-align:center;padding:4rem 2rem">
           <h1>Aviso no disponible</h1>
           <p>Este aviso no existe o no está publicado.</p>
           <a href="../index.php" class="btn btn-primary" style="margin-top:1.5rem">Volver al inicio</a>
          </div></div>';
    require_once __DIR__ . '/../includes/footer.php';
    exit;
}

// Bloques de contenido
$sb = $conn->prepare(
    "SELECT * FROM av_aviso_bloques WHERE aviso_id=? ORDER BY orden ASC"
);
$sb->bind_param('i', $id);
$sb->execute();
$bloques = $sb->get_result()->fetch_all(MYSQLI_ASSOC);
$sb->close();

$page_title  = $aviso['titulo'];
$meta_desc   = $aviso['resumen'] ?? mb_substr(strip_tags($aviso['titulo']), 0, 155);
$current_page = '';

require_once __DIR__ . '/../includes/banner.php';   // define $base
require_once __DIR__ . '/../includes/navbar.php';

// ── Helpers ──────────────────────────────────────────────────

function render_bloque(array $b, string $base): string
{
    switch ($b['tipo']) {
        case 'texto':
            return '<div class="doc-prose">' . $b['contenido'] . '</div>';

        case 'imagen':
            return '<figure class="av-pub-figure">'
                 . '<img src="' . htmlspecialchars($base . $b['contenido'], ENT_QUOTES) . '"'
                 . ' alt="' . htmlspecialchars($b['nombre_archivo'] ?? '', ENT_QUOTES) . '" loading="lazy">'
                 . '</figure>';

        case 'video':
            return render_video($b['contenido'] ?? '', $base);

        case 'pdf':
          return render_archivo($b, $base);

        case 'excel':
          return render_archivo($b, $base);

        default: // archivo
          return render_archivo($b, $base);
    }
}

    function render_archivo(array $b, string $base): string
    {
      $relativePath = (string)($b['contenido'] ?? '');
      $fileUrl = $base . $relativePath;
      $safeUrl = htmlspecialchars($fileUrl, ENT_QUOTES);
      $nombre = (string)($b['nombre_archivo'] ?? 'Archivo adjunto');
      $safeNombre = htmlspecialchars($nombre, ENT_QUOTES);

      $dbMime = strtolower((string)($b['mime_type'] ?? ''));
      $ext = strtolower(pathinfo($nombre, PATHINFO_EXTENSION));
      if ($ext === '') {
        $ext = strtolower(pathinfo($relativePath, PATHINFO_EXTENSION));
      }

      // Refuerzo: detectar por archivo físico para evitar depender solo de metadatos guardados.
      $localPath = local_file_from_relative($relativePath);
      $diskMime = '';
      if ($localPath && is_file($localPath)) {
        $diskExt = strtolower((string)pathinfo($localPath, PATHINFO_EXTENSION));
        if ($diskExt !== '') {
          $ext = $diskExt;
        }
        if (class_exists('finfo')) {
          $finfo = new finfo(FILEINFO_MIME_TYPE);
          $diskMime = strtolower((string)$finfo->file($localPath));
        }
      }
      $mime = $diskMime !== '' ? $diskMime : $dbMime;

      $isPdf = $ext === 'pdf' || strpos($mime, 'application/pdf') === 0;
      $isImage = in_array($ext, ['jpg', 'jpeg', 'png', 'gif', 'webp', 'bmp', 'svg', 'avif'], true)
         || strpos($mime, 'image/') === 0;
      $isWord = in_array($ext, ['doc', 'docx', 'odt', 'rtf', 'docm'], true)
            || in_array($mime, [
              'application/msword',
              'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
              'application/vnd.ms-word.document.macroenabled.12',
              'application/vnd.oasis.opendocument.text',
              'application/rtf',
             ], true);
      $isPpt = in_array($ext, ['ppt', 'pptx', 'odp', 'pps', 'ppsx', 'pptm'], true)
           || in_array($mime, [
              'application/vnd.ms-powerpoint',
              'application/vnd.openxmlformats-officedocument.presentationml.presentation',
              'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
              'application/vnd.ms-powerpoint.presentation.macroenabled.12',
              'application/vnd.oasis.opendocument.presentation',
            ], true);

      $badgeClass = 'av-pub-file';
      $icon = '📁';
      if ($isImage) {
        $badgeClass .= ' av-pub-file--img';
        $icon = '🖼️';
      } elseif ($isPdf) {
        $badgeClass .= ' av-pub-file--pdf';
        $icon = '📄';
      } elseif ($isWord) {
        $badgeClass .= ' av-pub-file--word';
        $icon = '📝';
      } elseif ($isPpt) {
        $badgeClass .= ' av-pub-file--ppt';
        $icon = '📽️';
      }

      $html = '<div class="' . $badgeClass . '">'
          . '<span class="av-pub-file-icon">' . $icon . '</span>'
          . '<div><p class="av-pub-file-name">' . $safeNombre . '</p>';

      if ($isImage) {
        $html .= '<div class="av-pub-file-preview">'
            . '<img class="av-pub-file-preview-img" src="' . $safeUrl . '" alt="' . $safeNombre . '" loading="lazy">'
            . '</div>';
      } elseif ($isPdf) {
        $html .= '<div class="av-pub-file-preview">'
            . '<iframe src="' . $safeUrl . '#view=FitH" loading="lazy" title="Vista previa PDF"></iframe>'
            . '</div>';
      } elseif ($isWord || $isPpt) {
        $officeViewer = 'https://view.officeapps.live.com/op/embed.aspx?src=' . rawurlencode(absolute_url_from_root($relativePath));
        $safeOfficeViewer = htmlspecialchars($officeViewer, ENT_QUOTES);
        $html .= '<div class="av-pub-file-preview">'
            . '<iframe src="' . $safeOfficeViewer . '" loading="lazy" title="Vista previa documento"></iframe>'
            . '</div>';
      } else {
        // Fallback: intentar vista previa genérica en el navegador.
        $html .= '<div class="av-pub-file-preview">'
            . '<iframe src="' . $safeUrl . '" loading="lazy" title="Vista previa archivo"></iframe>'
            . '</div>';
      }

      $html .= '<a class="av-pub-file-link" href="' . $safeUrl . '" target="_blank" rel="noopener">Abrir / Descargar</a>';

      $html .= '</div></div>';
      return $html;
    }

    function absolute_url(string $path): string
    {
      if (preg_match('#^https?://#i', $path)) {
        return $path;
      }

      $scheme = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
      $host = $_SERVER['HTTP_HOST'] ?? 'localhost';

      if (strpos($path, '/') === 0) {
        return $scheme . '://' . $host . $path;
      }

      return $scheme . '://' . $host . '/' . ltrim($path, '/');
    }

    /**
     * Construye una URL absoluta a partir de una ruta relativa al raíz del
     * proyecto (p.ej. "uploads/avisos/archivos/x.pptx"). Necesario para el
     * visor de Office Online, que requiere una URL pública resoluble.
     */
    function absolute_url_from_root(string $rootRelative): string
    {
      if (preg_match('#^https?://#i', $rootRelative)) {
        return $rootRelative;
      }

      $scheme = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
      $host   = $_SERVER['HTTP_HOST'] ?? 'localhost';

      // SCRIPT_NAME para pages/aviso.php => /<proyecto>/pages/aviso.php
      // Subimos dos niveles para obtener el prefijo del proyecto: /<proyecto>
      $script = $_SERVER['SCRIPT_NAME'] ?? '/';
      $prefix = str_replace('\\', '/', dirname(dirname($script)));
      if ($prefix === '.' || $prefix === '/' || $prefix === '\\') {
        $prefix = '';
      }
      $prefix = rtrim($prefix, '/');

      // Codificar cada segmento de la ruta para soportar espacios y acentos.
      $segments = array_map('rawurlencode', explode('/', ltrim($rootRelative, '/')));

      return $scheme . '://' . $host . $prefix . '/' . implode('/', $segments);
    }

    function local_file_from_relative(string $relativePath): string
    {
      $relativePath = ltrim(str_replace('\\', '/', $relativePath), '/');
      if ($relativePath === '') {
        return '';
      }

      $root = realpath(__DIR__ . '/..');
      if ($root === false) {
        return '';
      }

      return $root . DIRECTORY_SEPARATOR . str_replace('/', DIRECTORY_SEPARATOR, $relativePath);
    }

function render_video(string $contenido, string $base): string
{
    if (preg_match('/(?:youtu\.be\/|youtube\.com\/(?:watch\?v=|embed\/))([a-zA-Z0-9_\-]{11})/', $contenido, $m)) {
        $vid = htmlspecialchars($m[1], ENT_QUOTES);
        return '<div class="av-pub-embed"><iframe src="https://www.youtube.com/embed/' . $vid . '" allowfullscreen loading="lazy" title="Video"></iframe></div>';
    }
    if (preg_match('/vimeo\.com\/(\d+)/', $contenido, $m)) {
        return '<div class="av-pub-embed"><iframe src="https://player.vimeo.com/video/' . (int)$m[1] . '" allowfullscreen loading="lazy" title="Video"></iframe></div>';
    }
    return '<video controls class="av-pub-video"><source src="' . htmlspecialchars($base . $contenido, ENT_QUOTES) . '"><p>Tu navegador no soporta la reproducción de video.</p></video>';
}

// ── Fecha en español ─────────────────────────────────────────
function fecha_es_pub(string $fecha): string
{
    $meses = ['','enero','febrero','marzo','abril','mayo','junio',
              'julio','agosto','septiembre','octubre','noviembre','diciembre'];
    [$y, $m, $d] = explode('-', $fecha);
    return (int)$d . ' de ' . $meses[(int)$m] . ' de ' . $y;
}
?>

<!-- ────────────────────────────────────────────────────────
     AVISO INDIVIDUAL
     ──────────────────────────────────────────────────────── -->
<div class="doc-shell">
    <article class="doc-paper">

        <!-- Cabecera del documento -->
        <header class="doc-header">
            <div class="doc-kicker">Aviso institucional</div>
            <h1 style="font-family:var(--font-head);font-size:clamp(1.4rem,3vw,2rem);font-weight:700;
                 color:var(--c-primary);text-transform:uppercase;line-height:1.15;margin:.5rem 0 .8rem">
                <?= htmlspecialchars($aviso['titulo'], ENT_QUOTES) ?>
            </h1>
            <div class="doc-meta">
                <div class="doc-meta-card">
                    <span class="doc-meta-label">Fecha de publicación</span>
                    <span class="doc-meta-value"><?= fecha_es_pub($aviso['fecha_publicacion']) ?></span>
                </div>
            </div>
        </header>

        <!-- Banner del aviso -->
        <?php if ($aviso['banner_path']): ?>
        <div class="av-pub-banner">
            <img src="<?= htmlspecialchars($base . $aviso['banner_path'], ENT_QUOTES) ?>"
                alt="<?= htmlspecialchars($aviso['banner_alt'] ?? $aviso['titulo'], ENT_QUOTES) ?>" loading="lazy">
        </div>
        <?php endif; ?>

        <!-- Cuerpo: bloques de contenido -->
        <div class="doc-body">
            <?php foreach ($bloques as $bloque): ?>
            <div class="av-pub-bloque">
                <?= render_bloque($bloque, $base) ?>
            </div>
            <?php endforeach; ?>

            <?php if (empty($bloques)): ?>
            <p style="color:var(--c-muted)">Este aviso no tiene contenido todavía.</p>
            <?php endif; ?>
        </div>

        <!-- Volver -->
        <div style="margin-top:2.5rem;padding-top:1.5rem;border-top:1px solid var(--c-border)">
            <a href="<?= $base ?>pages/avisos-lista.php" class="btn btn-outline">← Ver todos los avisos</a>
            &nbsp;
            <a href="<?= $base ?>index.php" class="btn btn-primary">Inicio</a>
        </div>

    </article>
</div>

<style>
.av-pub-banner {
    margin: 0 0 1.8rem;
    border-radius: 8px;
    overflow: hidden;
}

.av-pub-banner img {
    width: 100%;
    max-height: 400px;
    object-fit: cover;
    display: block;
}

.av-pub-bloque {
    margin-bottom: 1.6rem;
}

.doc-prose {
    line-height: 1.75;
    color: var(--c-text);
}

.doc-prose p {
    margin-bottom: .85rem;
}

.doc-prose h2,
.doc-prose h3 {
    font-family: var(--font-head);
    color: var(--c-primary);
    text-transform: uppercase;
    margin: 1.3rem 0 .5rem;
}

.doc-prose ul,
.doc-prose ol {
    margin: .6rem 0 .8rem 1.6rem;
}

.doc-prose li {
    margin-bottom: .3rem;
}

.doc-prose a {
    color: var(--c-primary);
}

.av-pub-figure {
    margin: 0;
    text-align: center;
}

.av-pub-figure img {
    max-width: 100%;
    border-radius: 6px;
    border: 1px solid var(--c-border);
    display: inline-block;
}

.av-pub-embed {
    position: relative;
    padding-bottom: 56.25%;
    height: 0;
    overflow: hidden;
    border-radius: 8px;
}

.av-pub-embed iframe {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    border: 0;
}

.av-pub-video {
    width: 100%;
    border-radius: 8px;
}

.av-pub-file {
    display: flex;
    flex-direction: column;
    align-items: center;
    text-align: center;
    gap: .6rem;
    padding: .9rem 1.2rem;
    border: 1px solid var(--c-border);
    border-radius: 8px;
    background: #fafbff;
    margin-left: auto;
    margin-right: auto;
    max-width: 900px;
}

.av-pub-file>div {
    width: 100%;
}

.av-pub-file--pdf {
    border-left: 4px solid #dc3545;
}

.av-pub-file--excel {
    border-left: 4px solid #198754;
}

.av-pub-file--img {
    border-left: 4px solid #6f42c1;
}

.av-pub-file--word {
    border-left: 4px solid #0d6efd;
}

.av-pub-file--ppt {
    border-left: 4px solid #fd7e14;
}

.av-pub-file-icon {
    font-size: 1.9rem;
    flex-shrink: 0;
}

.av-pub-file-name {
    font-weight: 600;
    color: var(--c-text);
    margin-bottom: .2rem;
}

.av-pub-file-link {
    font-size: .82rem;
    font-weight: 700;
    color: var(--c-primary);
}

.av-pub-file-link:hover {
    color: var(--c-accent-dk);
}

.av-pub-file-preview {
    margin: .55rem 0 .5rem;
    border: 1px solid var(--c-border);
    border-radius: 8px;
    overflow: hidden;
    background: #fff;
}

.av-pub-file-preview iframe {
    width: 100%;
    min-height: 560px;
    border: 0;
    display: block;
}

.av-pub-file-preview-img {
    display: block;
    width: 100%;
    height: auto;
    max-height: 560px;
    object-fit: contain;
    background: #fff;
}

@media (max-width: 768px) {
    .av-pub-file-preview iframe {
        min-height: 420px;
    }

    .av-pub-file-preview-img {
        max-height: 420px;
    }
}
</style>

<?php require_once __DIR__ . '/../includes/footer.php'; ?>