<?php

require_once __DIR__.'/authenticator.abstract.class.php';

/**
 * Authentification des utilisateurs via base de données.
 */
class authenticator_database extends authenticator {

    /**
     * Authentifie l'utilisateur via une base de données.
     *
     * @param  array  $data  Données concernant l'utilisateur à authentifier.
     *
     * @return array   format: (bool $authenticated, string $message, array $data)
     */
    public function authenticate(array $data) {
        list($login, $password) = $this->get_login_and_password($data);
        if (is_null($login) || empty($login)) {
            return array(false, __("Identifiant vide"), array());
        }
        return $this->do_authenticate($login, $password);
    }

    /**
     * Réalise l'authentification.
     *
     * @param  string  $login       Login de l'utilisateur
     * @param  string  $password    Mot de passe de l'utilisateur
     * @param  bool    $encode_pwd  Encode le password si 'true'
     *
     * @return bool|string  'true' (bool) si l'utilisateur a été authentifié, ou un message d'erreur
     */
    protected function do_authenticate(string $login, string $password, bool $encode_pwd = true) {
        $authenticated = false;
        $sql = sprintf("
            SELECT
                COUNT(om_utilisateur)
            FROM
                %som_utilisateur
            WHERE
                login='%s' AND pwd='%s'",
            DB_PREFIXE,
            $this->framework->db->escapeSimple($login),
            $this->framework->db->escapeSimple(
                $encode_pwd ? md5($password) : $password));
        $qres = $this->framework->get_one_result_from_db_query(
            $sql, array('origin' => __METHOD__));
        if ($qres['code'] != 'OK') {
            return array(false,
                $qres['message'] ?? __("Échec de l'interrogation de la base de données."),
                array());
        }
        if($authenticated = intval($qres['result']) === 1) {
            return array(true, '', array());
        }
        return array(false,
            __("Votre identifiant ou votre mot de passe est incorrect."),
            array());
    }
}
