<?php
//$Id$ 
//gen openMairie le 21/02/2022 17:35

require_once "../gen/obj/instruction_notification_document.class.php";

class instruction_notification_document extends instruction_notification_document_gen {

    /**
     * Redirige vers la vue permettant de télécharger le document
     * selon le type de document a télécharger.
     *
     * Pour cela, cette méthode utilise la clé fournie dans l'url d'accès au document
     * pour récupérer l'instance de l'élément auquel est rattaché le document.
     * Si pour cette instance, il existe une méthode permettant de récupérer
     * le document, cette méthode est appelée.
     * 
     * Sinon renvoie une erreur 404.
     */
    public function view_telecharger_document_anonym() {
        $cle_acces_document = $this->f->get_submitted_get_value('key');
        if (empty($cle_acces_document)) {
            $cle_acces_document = $this->f->get_submitted_post_value('cle_acces_document');
        }

        // Par défaut on considère qu'on va afficher le formulaire
        // Flag d'erreur
        $error = false;
        // Message d'erreur
        $message = '';

        // Paramètres POST
        $validation = $this->f->get_submitted_post_value('validation');

        $email = $this->f->get_submitted_post_value('email');

        $timestamp_generation_formulaire = $this->f->get_submitted_post_value('timestamp_generation_formulaire');

        // Si au moins un des champs n'est pas renseignés
        if ($error !== true
            && $validation !== null
            && ($email === null || $email == '')
        ) {
            $message = __("Tous les champs doivent etre remplis.");
            $error = true;
        }
        // Si le formulaire est expiré
        if ($error !== true
            && $validation !== null
            && time() >= strtotime('+5 minutes', $timestamp_generation_formulaire)) {
            $message = __("Le formulaire a expire. Veuillez recharger la page.");
            $error = true;
        }

        if ( $error === true || $validation === null ) {
            $this->display_instruction_notification_document_form($message, $cle_acces_document);
            return;
        }

        // Récupération de l'instance actuelle et de l'instruction_notification liée
        $instruction_notification_document = $this->get_instance_from_cle($cle_acces_document);
        if ($instruction_notification_document === null) {
            $this->display_instruction_notification_document_form(__("Ressource non trouvée"), $cle_acces_document);
            return;
        }

        $instruction_notification = $instruction_notification_document->get_inst_common(instruction_notification::class);

        // Vérification que l'adresse mail est correcte
        if (strtolower($instruction_notification->getVal('courriel')) !== strtolower($email)) {
            $this->display_instruction_notification_document_form(
                __("L'adresse email ne correspond pas à celle attendue."), 
                $cle_acces_document
            );
            return;
        }

        // La personne a bien les droits : on lance le téléchargement du document
        $instruction_notification_document->download_document();

        // Récupération de la date de premier accès et maj du suivi uniquement
        // si la date de 1er accès n'a pas encore été remplis
        if ($instruction_notification->getVal('date_premier_acces') == null ||
            $instruction_notification->getVal('date_premier_acces') == '') {
            $notif_val = array();
            foreach ($instruction_notification->champs as $champ) {
                $notif_val[$champ] = $instruction_notification->getVal($champ);
            }
            $notif_val['date_premier_acces'] = date("Y-m-d H:i:s");
            $notif_val['statut'] = 'vu';
            $notif_val['commentaire'] = 'Le document a été vu';
            $instruction_notification->modifier($notif_val);
        }
    }

    protected function download_document(): void
    {
        // Récupération du document
        $instanceDoc = $this->get_inst_document_type_by_key();

        if ($instanceDoc === null) {
            $this->f->addToLog(
                sprintf("Document référencé inexistant pour l'élément %s#%s", get_class($this), $this->getVal($this->clePrimaire)),               
            );
            $this->display_instruction_notification_document_form(__("Ressource non trouvée."));
            return;
        }

        if (!method_exists($instanceDoc, 'get_fichier')) {
            $this->f->addToLog(
                sprintf("La notification tente de télécharger un document sur la classe '%s' qui n'a pas été prévue pour ça (pas de méthode get_fichier)", get_class($instanceDoc)),               
            );
            $this->display_instruction_notification_document_form(
                __("Impossible de télécharger ce type de document.")
            );
            return;
        }

        if ($this->getVal('document_type') === 'consultation_pec') {
            $fichier = $instanceDoc->get_fichier('fichier_pec');
        } else if ($this->getVal('document_type') === 'consultation') {
            $fichier = $instanceDoc->get_fichier('fichier');
        } else {
            $fichier = $instanceDoc->get_fichier();
        }

        if ($fichier === null || $fichier === OP_FAILURE) {
            $this->f->addToLog(
                sprintf("Fichier introuvable sur le sytème de fichier pour ", get_class($instanceDoc), $instanceDoc->getVal($instanceDoc->clePrimaire)),               
            );
            $this->display_instruction_notification_document_form(__("Ressource non trouvée."));
            return;
        }

        // Le fichier a été correctement identifié et récupéré : on le télécharge
        header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
        header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date dans le passé
        header("Content-Type: ".$fichier['metadata']['mimetype']);
        header("Accept-Ranges: bytes");
        header("Content-Disposition: inline; filename=\"".$fichier['metadata']['filename']."\";" );
        echo $fichier['file_content'];
    }

    /**
     * Affiche le formulaire d'accès au document de notification.
     *
     * @param string  $message      Message d'erreur.
     * @param boolean $content_only Affiche le contenu seulement.
     *
     * @return void
     */
    public function display_instruction_notification_document_form($message, $cle_acces_document = '') {
        // En mode anonyme, l'appel à l'affichage du framework est désactivé pour permettre 
        // le téléchargement de document. On le réactive ici pour afficher du HTML.
        $this->f->display();

        $cle_acces_document = $this->f->get_submitted_get_value('key');
        if (empty($cle_acces_document)) {
            $cle_acces_document = $this->f->get_submitted_post_value('cle_acces_document');
        }

        // Affichage du message d'erreur
        if (isset($message) && $message != "") {
            printf('<div class="alert alert-danger" role="alert">%s</div>', $message);
        }

        // Ouverture du formulaire
        printf("<div class=\"formulaire\" id=\"formulaire\"><form class=\"form-signin\" method=\"POST\" id=\"instruction_notification_document\" action=\"notification.php\">");

        $champs = array('email', 'cle_acces_document', 'timestamp_generation_formulaire');

        //Pour accéder au document, saisissez l'adresse email à laquelle la notification a été reçue:
        echo "<p> ".__("Pour accéder au document, saisissez l'adresse email à laquelle la notification a été reçue.")." </p>";

        //
        $form = $this->f->get_inst__om_formulaire(array(
            "validation" => 0,
            "maj" => 0,
            "champs" => $champs,
        ));
        $form->setType('email', 'text');
        $form->setType('cle_acces_document', 'hidden'); // 'hidden'
        $form->setType('timestamp_generation_formulaire', 'hidden');// 'hidden'

        $form->setTaille('email', 50);
        $form->setTaille('cle_acces_document', 30);
        $form->setTaille('timestamp_generation_formulaire', 20);

        $form->setMax('email', -1);
        $form->setMax('cle_acces_document', 30);
        $form->setMax('timestamp_generation_formulaire', 20);

        $form->setLib('email', __('Email:'));
        $form->setLib('cle_acces_document', '');
        $form->setLib('timestamp_generation_formulaire', '');

        $form->setVal('cle_acces_document',  $cle_acces_document);
        $form->setVal('timestamp_generation_formulaire', time());

        $form->setBloc("email", "D", "", "group");
        $form->setBloc("timestamp_generation_formulaire", "F");
        $form->afficher($champs, 0, false, false);

        // Bouton de validation
        echo "<div class=\"formControls formControls-bottom\">";
        echo "<input type=\"submit\" class=\"btn btn-lg btn-primary btn-block\" value=\"".__("Valider")."\" name=\"validation\" />";
        echo "</div>";
        printf("</form>");

        // Fermeture du div formulaire
        printf("</div>");

    }

    /**
     * Récupère une instance de la classe courante en se basant sur la clé au lieu de l'ID
     */
    protected function get_instance_from_cle(string $cle_acces_document): ?static {
            $sql = sprintf(<<<'SQL'
                SELECT instruction_notification_document 
                FROM %1$sinstruction_notification_document 
                WHERE cle = '%2$s'
            SQL,
            DB_PREFIXE,
            $cle_acces_document,
        );
        $qres = $this->f->get_one_result_from_db_query(
            $sql,
            array(
                'origin' => 'web/notification.php -> instruction_notification_document.class.php'
            )
        );

        if ($qres['result'] === null) {
            return null;
        }

        return new static($qres['result']);
    }

    /**
     * Récupère le nom de la table à laquelle est rattaché le document
     * notifié et l'identifiant de l'élément auquel il appartient.
     *
     * Instancie l'objet voulu à partir de ces informations et renvoie
     * cette instance.
     */
    protected function get_inst_document_type_by_key(): dbForm {
        return $this->f->get_inst__om_dbform([
            "obj" => ($this->getVal('document_type') === 'consultation_pec' ? 'consultation' : $this->getVal('document_type')),
            "idx" => $this->getVal('document_id'),
        ]);
    }
}
