<?php

declare(strict_types=1);

namespace App\Framework\Mcp\Core\ValueObjects;

/**
 * Value Object für Validation-Ergebnisse
 *
 * Kapselt das Ergebnis einer JSON Schema Validation
 */
final readonly class ValidationResult
{
    public function __construct(
        public bool $isValid,
        public array $errors = [],
        public array $validatedData = [],
        public array $warnings = []
    ) {
    }

    /**
     * Erstellt ein erfolgreiches Validation-Ergebnis
     */
    public static function success(array $validatedData = []): self
    {
        return new self(
            isValid: true,
            validatedData: $validatedData
        );
    }

    /**
     * Erstellt ein fehlgeschlagenes Validation-Ergebnis
     */
    public static function failure(array $errors, array $warnings = []): self
    {
        return new self(
            isValid: false,
            errors: $errors,
            warnings: $warnings
        );
    }

    /**
     * Erstellt ein Validation-Ergebnis mit Warnungen
     */
    public static function withWarnings(array $validatedData, array $warnings): self
    {
        return new self(
            isValid: true,
            validatedData: $validatedData,
            warnings: $warnings
        );
    }

    /**
     * Prüft ob es Warnungen gibt
     */
    public function hasWarnings(): bool
    {
        return ! empty($this->warnings);
    }

    /**
     * Gibt die Anzahl der Fehler zurück
     */
    public function getErrorCount(): int
    {
        return count($this->errors);
    }

    /**
     * Gibt die Anzahl der Warnungen zurück
     */
    public function getWarningCount(): int
    {
        return count($this->warnings);
    }

    /**
     * Gibt das erste Fehler-Message zurück
     */
    public function getFirstError(): ?string
    {
        return $this->errors[0] ?? null;
    }

    /**
     * Konvertiert zu Array für Serialization
     */
    public function toArray(): array
    {
        return [
            'is_valid' => $this->isValid,
            'errors' => $this->errors,
            'validated_data' => $this->validatedData,
            'warnings' => $this->warnings,
            'error_count' => $this->getErrorCount(),
            'warning_count' => $this->getWarningCount(),
        ];
    }
}
