<?php
/**
 * Ce script définit la classe 'candidat'.
 *
 * @package openresultat
 * @version SVN : $Id$
 */

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

/**
 * Définition de la classe 'candidat'.
 *
 * Cette classe gère les candidats aux élections. Elle hérite de la classe
 * générée candidat_gen et ajoute des fonctionnalités spécifiques comme
 * l'exposition des données en JSON et la gestion des doublons.
 */
class candidat extends candidat_gen {

    /**
     * Définition des actions disponibles sur la classe.
     *
     * Ajoute les actions JSON permettant d'exposer les données des candidats
     * via une API REST :
     * - json_list (997) : liste de tous les candidats
     * - json_data (998) : données d'un candidat spécifique
     *
     * @return void
     */
    function init_class_actions() {
        parent::init_class_actions();
        // ACTION - 997 - json_list
        // Expose la liste des candidats au format JSON
        $this->class_actions[997] = array(
            "identifier" => "json_list",
            "view" => "view_json_list",
            "permission_suffix" => "tab",
        );
        // ACTION - 998 - json_data
        // Expose les données d'un candidat au format JSON
        $this->class_actions[998] = array(
            "identifier" => "json_data",
            "view" => "view_json_data",
            "permission_suffix" => "consulter",
        );
    }

    /**
     * SETTER FORM - setLib
     *
     * @param formulaire $form Instance formulaire.
     * @param integer $maj Identifant numérique de l'action.
     *
     * @return void
     */
    function setLib(&$form, $maj) {
        //libelle des champs pour éviter les termes techniques
        parent::setLib($form, $maj);
        $form->setLib('libelle_liste', 'Liste');
    }

    /**
     * Vérifie la validité des valeurs en mode CREATE & UPDATE.
     *
     * @param array $val Tableau des valeurs brutes.
     * @param null &$dnu1 @deprecated  Ne pas utiliser.
     * @param null $dnu2 @deprecated  Ne pas utiliser.
     *
     * @return void
     */
    function verifier($val = array(), &$dnu1 = null, $dnu2 = null) {
        $result = parent::verifier($val);
        // Vérifie si une unité possédant le même nom n'existe pas déjà
        if (! $this->isUnique('libelle', $val['libelle'])) {
            $this->addToMessage('ATTENTION : un candidat portant ce nom existe déjà !');
        }
        return $result;
    }

    /**
     * Ajoute un candidat si un candidat de même libellé n'existe pas
     * déjà.
     * Renvoie un tableau contenant des informations relatives à l'ajout tel que :
     *  - id : identifiant du candidat existant si trouvé ou ajouté sinon
     *  - nouvel_ajout : booleen indiquant si un candidat a été ajouté ou pas
     *  - succes : booleen indiquant si le traitement à fonctionné
     *  - message : message en cas d'erreur de traitement
     *
     * @param string libelle : libellé du candidat
     * @return array
     */
    function ajouter_candidat_si_non_existant($libelle) {
        // Vérification de l'existence du candidat
        $traitement_infos = array(
            'id' => $this->recuperer_id_candidat_via_libelle($libelle),
            'nouvel_ajout' => false,
            'succes' => true,
            'message' => ''
        );
        
        // Création du candidat si l'id est vide c'est à dire si aucun candidat
        // ne correspond au libellé
        if (empty($traitement_infos['id'])) {
            $val = array(
                'candidat' => '',
                'libelle' => $libelle,
                'libelle_liste' => null
            );
            if ($this->ajouter($val) === false) {
                // Si l'ajout du candidat echoue récupère le message d'erreur
                $traitement_infos['false'] = true;
                $traitement_infos['message'] = $this->msg;
            } else {
                // Récupère l'id du dernier élement de la table candidat, soit
                // l'id du dernier candidat ajouté
                $res = $this->f->get_one_result_from_db_query(
                    "SELECT CURRVAL('".DB_PREFIXE."candidat_seq')",
                    array('origin' => __METHOD__)
                );
                $traitement_infos['id'] = $res['result'];
                $traitement_infos['nouvel_ajout'] = true;
            }
        }

        return $traitement_infos;
    }

    /**
     * Cherche via une requête sql si un candidat ayant le
     * libellé fourni existe, récupère son identifiant et le renvoie.
     *
     * Note : la recherche de libellé des candidats n'est pas sensible à la casse
     *
     * @param string libelle : libelle du candidat
     * @return string
     */
    function recuperer_id_candidat_via_libelle($libelle) {
        $res = $this->f->get_one_result_from_db_query(
            sprintf(
                "SELECT candidat
                FROM %scandidat
                WHERE LOWER(libelle) = LOWER('%s')",
                DB_PREFIXE,
                $this->f->db->escapeSimple($libelle)
            ),
            array('origin' => __METHOD__)
        );

        return $res['result'];
    }
}
