<?php
declare(strict_types=1);

namespace ROITheme\Shared\Domain\Exceptions;

/**
 * Excepción de dominio para errores de validación
 *
 * Usada cuando las reglas de negocio no se cumplen.
 * Ubicada en Shared porque es usada por múltiples bounded contexts.
 */
final class ValidationException extends \DomainException
{
    /**
     * @param string $message Mensaje descriptivo del error de validación
     * @param int $code Código de error (default 0)
     * @param \Throwable|null $previous Excepción anterior para encadenamiento
     */
    public function __construct(
        string $message,
        int $code = 0,
        ?\Throwable $previous = null
    ) {
        parent::__construct($message, $code, $previous);
    }

    /**
     * Factory: Campo requerido faltante
     */
    public static function requiredField(string $fieldName): self
    {
        return new self("El campo '{$fieldName}' es requerido");
    }

    /**
     * Factory: Valor inválido
     */
    public static function invalidValue(string $fieldName, string $reason): self
    {
        return new self("Valor inválido para '{$fieldName}': {$reason}");
    }

    /**
     * Factory: Longitud excedida
     */
    public static function maxLengthExceeded(string $fieldName, int $maxLength): self
    {
        return new self("El campo '{$fieldName}' excede el máximo de {$maxLength} caracteres");
    }
}
