<?php

declare(strict_types=1);

namespace App\Support\Ui\ActionSurface;

final class ActionSurfaceValidationResult
{
    /**
     * @param  array<int, ActionSurfaceValidationIssue>  $issues
     */
    public function __construct(
        private readonly array $issues,
        private readonly int $componentCount,
    ) {}

    public function hasIssues(): bool
    {
        return $this->issues !== [];
    }

    /**
     * @return array<int, ActionSurfaceValidationIssue>
     */
    public function issues(): array
    {
        return $this->issues;
    }

    public function componentCount(): int
    {
        return $this->componentCount;
    }

    public function formatForAssertion(): string
    {
        if (! $this->hasIssues()) {
            return sprintf('Validated %d action-surface components with no issues.', $this->componentCount);
        }

        $lines = array_map(
            static fn (ActionSurfaceValidationIssue $issue): string => '- '.$issue->format(),
            $this->issues,
        );

        return sprintf(
            "Action Surface Contract violations (%d/%d):\n%s",
            count($this->issues),
            $this->componentCount,
            implode("\n", $lines),
        );
    }
}
