<?php

namespace App\Service\Generator;

/**
 * Class TempPasswordGenerator
 *
 * Fournit des fonctionnalités pour générer des mots de passe temporaires sécurisés.
 */
class TempPasswordGenerator
{
    private const DEFAULT_LENGTH = 12;
    private const DEFAULT_CHARACTERS = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()-_=+[]{}|;:,.<>?';

    /**
     * Génère un mot de passe temporaire aléatoire.
     *
     * @param int $length Longueur désirée du mot de passe (par défaut 12).
     * @param string $characters Jeu de caractères à utiliser dans le mot de passe.
     * @return string Mot de passe généré.
     */
    public static function generate(int $length = self::DEFAULT_LENGTH, string $characters = self::DEFAULT_CHARACTERS): string
    {
        if ($length <= 0) {
            $length = self::DEFAULT_LENGTH;
        }

        $password = '';
        $maxIndex = strlen($characters) - 1;

        for ($i = 0; $i < $length; $i++) {
            $password .= $characters[random_int(0, $maxIndex)];
        }

        return $password;
    }

    /**
     * Vérifie si un mot de passe remplit certaines exigences de complexité.
     *
     * @param string $password Mot de passe à vérifier.
     * @return bool True si les critères sont respectés, false sinon.
     */
    public static function isComplex(string $password): bool
    {
        return strlen($password) >= 8
            && preg_match('/[A-Z]/', $password)
            && preg_match('/[a-z]/', $password)
            && preg_match('/[0-9]/', $password)
            && preg_match('/[!@#$%^&*()\-_=+\[\]{}|;:,.<>?]/', $password);
    }
}
