<?php

namespace Acms\Services\Setup\Tool;

/**
 * ツールのバリデーション/実行エラーを表す不変の型付きコレクション。
 *
 * 旧 Surfacer の public 可変プロパティ `$this->Error`（`array<string,mixed>`）を置き換える。
 * `$this->Error['blod_name_input'] = true` のようなキー typo（実際に混入したバグ）を、生成を
 * {@see with} に集約し不変にすることで検知しやすくする。detail は既定 true（フラグ）だが、
 * インポート失敗メッセージのように文字列を持たせることもできる（Twig 側で `errors.seed_failed` 参照）。
 */
final class ToolErrors
{
    /**
     * @param array<string, mixed> $items エラーキー → detail（true もしくはメッセージ文字列）
     */
    public function __construct(private readonly array $items = [])
    {
    }

    /**
     * エラーを 1 件足した新しいインスタンスを返す（不変）。
     */
    public function with(string $key, mixed $detail = true): self
    {
        $items = $this->items;
        $items[$key] = $detail;

        return new self($items);
    }

    /**
     * 別のコレクションを取り込んだ新しいインスタンスを返す（不変・同一キーは相手優先）。
     */
    public function merge(self $other): self
    {
        return new self(array_merge($this->items, $other->all()));
    }

    public function isEmpty(): bool
    {
        return $this->items === [];
    }

    /**
     * @return list<string>
     */
    public function keys(): array
    {
        return array_keys($this->items);
    }

    /**
     * @return array<string, mixed>
     */
    public function all(): array
    {
        return $this->items;
    }
}
