<?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 readonly class Range implements ValidationRule
{
    /**
     * @param float|null $min Minimaler Wert
     * @param float|null $max Maximaler Wert
     * @param string|null $message Benutzerdefinierte Fehlermeldung
     */
    public function __construct(
        private ?float  $min = null,
        private ?float  $max = null,
        private ?string $message = null
    ) {
        if ($min === null && $max === null) {
            throw new \InvalidArgumentException('Mindestens einer der Parameter min oder max muss gesetzt sein.');
        }
    }

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

        if (!is_numeric($value)) {
            return false;
        }

        if ($this->min !== null && $value < $this->min) {
            return false;
        }

        if ($this->max !== null && $value > $this->max) {
            return false;
        }

        return true;
    }

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

        if ($this->min !== null && $this->max !== null) {
            return ["Dieser Wert muss zwischen {$this->min} und {$this->max} liegen."];
        } elseif ($this->min !== null) {
            return ["Dieser Wert muss mindestens {$this->min} sein."];
        } else {
            return ["Dieser Wert darf maximal {$this->max} sein."];
        }
    }
}
