<?php

declare(strict_types=1);

namespace Afup\Site\Utils;

use Afup\Site\Corporate\_Site_Base_De_Donnees;

/**
 * Classe de gestion des logs
 */
class Logs
{
    private int $_nombre_logs_par_page = 10;

    public function __construct(
        private readonly _Site_Base_De_Donnees $_bdd,
        private readonly int $_id_utilisateur,
    ) {}

    /**
     * Renvoit l'instance unique de la classe Afup\Site\Utils\Logs
     *
     * Cette fonction est une implémentation du pattern Singleton.
     * Cela permet d'appeller statiquement les méthodes de cette classe depuis n'importe où.
     */
    public static function &_obtenirInstance(): self
    {
        // TODO : Utiliser une propriété statique en PHP5
        if (!isset($GLOBALS['_afup_log'])) {
            throw new \RuntimeException("The logs instance has not been initialized");
        }

        return $GLOBALS['_afup_log'];
    }

    /**
     * Initialise les propriétés de la classe
     *
     * @param  _Site_Base_De_Donnees $bdd Instance de la couche d'abstraction à la base de données
     * @param  int $id_utilisateur Identifiant de l'utilisateur connecté
     */
    public static function initialiser(&$bdd, $id_utilisateur): void
    {
        $GLOBALS['_afup_log'] = new self($bdd, $id_utilisateur);
    }

    /**
     * Log le texte fourni
     *
     * @param  string $texte Texte à logger
     */
    public static function log($texte): void
    {
        $instance = & self::_obtenirInstance();
        $requete = 'INSERT INTO';
        $requete .= '  afup_logs (id, date, id_personne_physique, texte) ';
        $requete .= 'VALUES (';
        $requete .= '  NULL,';
        $requete .= '  ' . time() . ',';
        $requete .= '  ' . $instance->_id_utilisateur . ',';
        $requete .= '  ' . $instance->_bdd->echapper($texte);
        $requete .= ')';
        $instance->_bdd->Executer($requete);
    }

    /**
     * Renvoit tous les logs de la page indiquée
     *
     * @param  int $numero_page Numéro de la page concernée
     * @return array    Les logs correspondant à la page indiquée
     */
    public static function obtenirTous($numero_page)
    {
        $instance = & self::_obtenirInstance();
        $depart = ($numero_page - 1) * $instance->_nombre_logs_par_page;
        $requete = 'SELECT';
        $requete .= '  afup_logs.*,';
        $requete .= '  IF(afup_personnes_physiques.nom != "", afup_personnes_physiques.nom, "BOT") as nom,';
        $requete .= '  afup_personnes_physiques.prenom ';
        $requete .= 'FROM';
        $requete .= '  afup_logs';
        $requete .= '  LEFT JOIN afup_personnes_physiques';
        $requete .= '  ON afup_personnes_physiques.id=afup_logs.id_personne_physique ';
        $requete .= 'ORDER BY';
        $requete .= '  afup_logs.date DESC ';
        $requete .= 'LIMIT';
        $requete .= '  ' . $depart . ', ' . $instance->_nombre_logs_par_page;
        return $instance->_bdd->obtenirTous($requete);
    }

    /**
     * Renvoit le nombre de pages de logs
     *
     * @return int  Nombre de pages
     */
    public static function obtenirNombrePages(): int
    {
        $instance = & self::_obtenirInstance();
        $nombre = $instance->_bdd->obtenirUn('SELECT COUNT(*) FROM afup_logs');
        if (!$instance->_nombre_logs_par_page) {
            return 1;
        }
        $nombre = ceil($nombre / $instance->_nombre_logs_par_page);
        return $nombre === 0.0 ? 1 : (int) $nombre;
    }
}
