<?php

namespace Acms\Services\Setup\Install;

use Acms\Services\Setup\Tool\ToolErrors;

/**
 * インストールウィザードの各ステップ（check / commit）の結果を表す不変ペイロード。
 *
 * 旧 AbstractStep は public 可変プロパティ `$Error` / `$Notice` を書き換えて結果を伝えていたが、
 * これを戻り値へ移す。errors はブロッキング（次フェーズへ進めない）、notices は非ブロッキングの通知。
 * data はテンプレートへ渡す操作結果（作成テーブル一覧など）。redirect は完了フェーズの遷移先。
 */
final class StepResult
{
    /**
     * @param array<string, mixed> $data
     */
    public function __construct(
        public readonly ToolErrors $errors,
        public readonly ToolErrors $notices,
        public readonly array $data = [],
        public readonly ?string $redirect = null,
    ) {
    }

    public static function ok(): self
    {
        return new self(new ToolErrors(), new ToolErrors());
    }

    /**
     * check と commit の結果を統合する（errors/notices は union、data は後勝ち、redirect は相手優先）。
     */
    public function merge(self $other): self
    {
        return new self(
            $this->errors->merge($other->errors),
            $this->notices->merge($other->notices),
            array_merge($this->data, $other->data),
            $other->redirect ?? $this->redirect,
        );
    }
}
