<?php
/**
 * DocController — portail de documentation in-app.
 *
 *   GET /doc        → liste les docs autorisés pour l'utilisateur (4 familles).
 *   GET /doc/:slug  → affiche un doc précis, APRÈS revalidation de l'accès.
 *
 * L'autorité d'autorisation est entièrement déléguée à DocCatalog : la liste et
 * l'affichage partagent le même filtre, donc un slug hors périmètre → 403.
 */
class DocController extends Controller
{
    public function index(): void
    {
        $this->requireLogin();

        $this->view(WEBROOT_PATH . '/views/doc/index.php', [
            'groups' => DocCatalog::forUser($this->currentUser),
        ]);
    }

    public function show(string $slug): void
    {
        $this->requireLogin();

        $doc = DocCatalog::resolve($slug, $this->currentUser);
        if ($doc === null) {
            // Slug inexistant OU hors périmètre de l'utilisateur → accès refusé.
            http_response_code(403);
            View::display(WEBROOT_PATH . '/includes/403.php');
            return;
        }

        $markdown = (string)file_get_contents($doc['file']);
        $html     = Markdown::toHtml($markdown);
        // Réécrit les liens .md internes vers /doc/<slug> et les images vers
        // la route d'asset contrôlée par les droits (cf. asset()).
        $html     = DocCatalog::rewriteLinks($html, $doc['file'], $slug);

        $this->view(WEBROOT_PATH . '/views/doc/show.php', [
            'docTitle' => $doc['title'],
            'docHtml'  => $html,
        ]);
    }

    /**
     * Sert une image embarquée dans le dossier d'un document.
     * Accès gaté par l'accès au document parent (DocCatalog::resolve).
     * Le chemin relatif de l'image est passé en query (?f=…).
     */
    public function asset(string $slug): void
    {
        $this->requireLogin();

        $doc = DocCatalog::resolve($slug, $this->currentUser);
        if ($doc === null) {
            http_response_code(403);
            View::display(WEBROOT_PATH . '/includes/403.php');
            return;
        }

        $rel    = (string)($_GET['f'] ?? '');
        $docDir = realpath(dirname($doc['file']));
        $target = $rel === '' ? false : realpath($docDir . '/' . $rel);

        // Liste blanche : fichier existant, sous le dossier du doc, extension image.
        $isImage = $target !== false
            && is_file($target)
            && str_starts_with($target, $docDir . DIRECTORY_SEPARATOR)
            && preg_match('/\.(png|jpe?g|gif|webp|svg)$/i', $target);

        if (!$isImage) {
            http_response_code(404);
            return;
        }

        $mime = match (strtolower(pathinfo($target, PATHINFO_EXTENSION))) {
            'svg'         => 'image/svg+xml',
            'webp'        => 'image/webp',
            'gif'         => 'image/gif',
            'jpg', 'jpeg' => 'image/jpeg',
            default       => 'image/png',
        };

        header('Content-Type: ' . $mime);
        header('Content-Length: ' . filesize($target));
        header('Cache-Control: private, max-age=300');
        readfile($target);
        exit;
    }
}
