<?php

declare(strict_types=1);

namespace App\Framework\Validation\Rules;

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

#[Attribute(Attribute::TARGET_PROPERTY | Attribute::TARGET_PARAMETER)]
final class In implements ValidationRule
{
    private array $values;

    /**
     * @param array $values Erlaubte Werte
     * @param string|null $message Benutzerdefinierte Fehlermeldung
     */
    public function __construct(
        array $values,
        private ?string $message = null
    ) {
        if (empty($values)) {
            throw new \InvalidArgumentException('Die Liste der erlaubten Werte darf nicht leer sein.');
        }
        $this->values = $values;
    }

    public function validate(mixed $value): bool
    {
        if ($value === null || $value === '') {
            return true; // Leere Werte werden von Required-Regel behandelt
        }

        return in_array($value, $this->values, true);
    }

    public function getErrorMessages(): array
    {
        if ($this->message !== null) {
            return [$this->message];
        }

        $valuesList = implode(', ', array_map(fn ($v) => "'$v'", $this->values));

        return ["Dieser Wert muss einer der folgenden sein: $valuesList."];
    }
}
