<?php
/**
 * ASISMA CRM - Política de contraseñas
 * Regla única para TODOS los puntos donde se define una contraseña de usuario:
 * crear usuario, resetear clave desde el módulo de usuarios y restablecer por
 * "olvidé mi contraseña". Si la política cambia, se cambia SOLO aquí (y el
 * patrón espejo de las vistas vía patronHtml()).
 */
class ClaveHelper {

    const DESCRIPCION = 'Mínimo 8 caracteres, al menos una mayúscula, un número y un carácter especial (ej: ! # $ % . -).';

    /**
     * Valida la contraseña contra la política.
     * Devuelve null si cumple, o el mensaje de error listo para mostrar.
     */
    public static function validar($clave) {
        $faltas = array();
        if (strlen($clave) < 8) {
            $faltas[] = 'tener al menos 8 caracteres';
        }
        if (!preg_match('/[A-Z]/', $clave)) {
            $faltas[] = 'incluir al menos una letra mayúscula';
        }
        if (!preg_match('/[0-9]/', $clave)) {
            $faltas[] = 'incluir al menos un número';
        }
        if (!preg_match('/[^a-zA-Z0-9]/', $clave)) {
            $faltas[] = 'incluir al menos un carácter especial (ej: ! # $ % . -)';
        }
        if (empty($faltas)) {
            return null;
        }
        return 'La contraseña debe ' . implode(', ', $faltas) . '.';
    }

    /**
     * Patrón espejo de validar() para el atributo pattern de los <input>
     * (validación nativa del navegador; el servidor valida igual).
     */
    public static function patronHtml() {
        return '(?=.*[A-Z])(?=.*[0-9])(?=.*[^a-zA-Z0-9]).{8,}';
    }
}
