<?php

namespace App\Libraries;

use DateTime;
use IntlDateFormatter;

/**
 * Librairie utilitaire de l'application GSBFrais.
 * Fournit des fonctions de formatage (dates, montants, mois).
 */
class Gsb_lib
{
    public function __construct()
    {
        session();
        setlocale(LC_TIME, "fr_FR.utf8", "fra_fra");
    }

    /**
     * Transforme une date yyyy-mm-dd en jj/mm/yyyy.
     *
     * @param string $maDate Date au format yyyy-mm-dd
     * @return string Date au format jj/mm/yyyy
     */
    public function date_vers_francais(string $maDate): string
    {
        [$annee, $mois, $jour] = explode('-', $maDate);
        return "$jour/$mois/$annee";
    }

    /**
     * Retourne le couple année/mois au format aaaamm pour le mois en cours.
     *
     * @param string|null $date Non utilisé actuellement
     * @return string Année et mois au format aaaamm
     */
    public function get_annee_mois(string $date = null): string
    {
        return date("Ym");
    }

    /**
     * Extrait l'année depuis une chaîne au format aaaamm.
     *
     * @param string|null $annee_mois
     * @return string Année sur 4 caractères
     */
    public function get_annee_from_anneemois(string $annee_mois = null): string
    {
        $num_annee = substr($annee_mois, 0, 4);
        return $num_annee;
    }

    /**
     * Extrait le mois depuis une chaîne au format aaaamm.
     *
     * @param string|null $annee_mois
     * @return string Numéro du mois
     */
    public function get_mois_from_anneemois(string $annee_mois = null): string
    {
        $num_mois = substr($annee_mois, 4, strlen($annee_mois) - 4);
        return $num_mois;
    }

    /**
     * Retourne le nom complet du mois en français (ex: "janvier").
     *
     * @param int    $unNoMois Numéro du mois (1 à 12)
     * @param string $locale   Locale à utiliser (par défaut fr_FR)
     * @return string Nom du mois
     */
    public function get_nom_mois(int $unNoMois, string $locale = 'fr_FR'): string
    {
        $date = DateTime::createFromFormat('!m', $unNoMois);
        $formatter = new IntlDateFormatter(
            $locale,
            IntlDateFormatter::NONE,
            IntlDateFormatter::NONE,
            null,
            null,
            'MMMM'
        );
        return $formatter->format($date);
    }

    /**
     * Formate un montant avec deux décimales et séparateur d'espace.
     *
     * @param float $montant
     * @return string Montant formaté (ex: "1 234,56")
     */
    public function format_montant($montant): string
    {
        return number_format($montant, 2, ',', ' ');
    }
}
