<?php
/**
 * DBFORM - 'document_travail' - Surcharge document_numerise.
 *
 * @package openads
 * @version SVN : $Id: document_travail.class.php 5839 2016-01-29 08:50:12Z fmichon $
 */

require_once "../obj/document_numerise.class.php";

class document_travail extends document_numerise {

    /**
     * Définition des actions disponibles sur la classe.
     *
     * @return void
     */
    function init_class_actions() {

        // On récupère les actions génériques définies dans la méthode
        // d'initialisation de la classe parente
        parent::init_class_actions();

        // ACTION - 410 - save_annotated_pdf
        // Endpoint AJAX pour sauvegarder un PDF annoté depuis pdfjs-measure
        $this->class_actions[410] = array(
            "identifier" => "save_annotated_pdf",
            "view" => "view_save_annotated_pdf",
            "permission_suffix" => "annoter",
        );
    }

    /**
     * VIEW - view_save_annotated_pdf
     *
     * Endpoint AJAX pour sauvegarder un PDF annoté depuis pdfjs-measure.
     * Reçoit le contenu du PDF en base64 et remplace le fichier existant
     * dans le stockage de l'application.
     *
     * Paramètres POST attendus :
     *   - pdf_content : contenu du PDF en base64
     *   - document_id : identifiant du document (optionnel, utilise idx si absent)
     *
     * @return void Affiche un JSON { status: true/false, message: '...' }
     */
    function view_save_annotated_pdf() {
        // Désactiver le log HTML et forcer le content-type JSON
        $this->checkAccessibility();
        $this->f->disableLog();
        header('Content-Type: application/json; charset=utf-8');

        // Vérification des permissions
        if (!$this->f->isAccredited(array('document_travail', 'document_travail_annoter'), "OR")) {
            echo json_encode(array(
                "status" => false,
                "message" => __("Permissions insuffisantes pour annoter ce document.")
            ));
            return;
        }

        // Récupération du contenu PDF en base64
        $pdf_base64 = isset($_POST['pdf_content']) ? $_POST['pdf_content'] : null;
        if (empty($pdf_base64)) {
            echo json_encode(array(
                "status" => false,
                "message" => __("Aucun contenu PDF reçu.")
            ));
            return;
        }

        // Décodage du base64
        $pdf_content = base64_decode($pdf_base64, true);
        if ($pdf_content === false) {
            echo json_encode(array(
                "status" => false,
                "message" => __("Contenu PDF invalide (décodage base64 échoué).")
            ));
            return;
        }

        // Vérification que c'est bien un PDF (magic bytes)
        if (substr($pdf_content, 0, 4) !== '%PDF') {
            echo json_encode(array(
                "status" => false,
                "message" => __("Le contenu reçu n'est pas un fichier PDF valide.")
            ));
            return;
        }

        // Récupération de l'UID du fichier actuel
        $current_uid = $this->getVal('uid');
        if (empty($current_uid)) {
            echo json_encode(array(
                "status" => false,
                "message" => __("Aucun fichier associé à ce document.")
            ));
            return;
        }

        // Récupération des métadonnées actuelles du fichier
        $current_file = $this->f->storage->get($current_uid);
        if (empty($current_file) || empty($current_file['metadata'])) {
            echo json_encode(array(
                "status" => false,
                "message" => __("Impossible de récupérer les métadonnées du fichier actuel.")
            ));
            return;
        }

        // Mise à jour des métadonnées avec la nouvelle taille
        $metadata = $current_file['metadata'];
        $metadata['size'] = strlen($pdf_content);

        // Mise à jour directe du fichier dans le stockage (remplacement en place)
        $result = $this->f->storage->update($current_uid, $pdf_content, $metadata, "from_content");
        if ($result === OP_FAILURE) {
            echo json_encode(array(
                "status" => false,
                "message" => __("Erreur lors de la mise à jour du fichier dans le stockage.")
            ));
            return;
        }

        $this->addToLog(
            __METHOD__ . "(): PDF annoté sauvegardé pour le document " . $this->getVal('document_numerise'),
            DEBUG_MODE
        );

        echo json_encode(array(
            "status" => true,
            "message" => __("Le PDF annoté a été sauvegardé avec succès.")
        ));
    }
}


