<?php
declare(strict_types=1);

namespace App\Framework\Validation\Rules;

use App\Framework\Validation\ValidationRule;
use Attribute;
use Closure;

#[Attribute(Attribute::TARGET_PROPERTY | Attribute::TARGET_PARAMETER)]
final readonly class Custom implements ValidationRule
{
    /**
     * @param callable $validator Funktion zur Validierung (erhält den Wert und gibt bool zurück)
     * @param array<string> $messages Fehlermeldungen
     */
    public function __construct(
        private Closure $validator,
        private array   $messages = ['Der angegebene Wert ist ungültig.']
    ) {
        if (!is_callable($validator)) {
            throw new \InvalidArgumentException('Der Validator muss eine aufrufbare Funktion sein.');
        }
    }

    public function validate(mixed $value): bool
    {
        return ($this->validator)($value);
    }

    public function getErrorMessages(): array
    {
        return $this->messages;
    }
}
