<?php

namespace Acms\Services\Setup\Tool;

use Acms\Services\Setup\Http\Request;
use Acms\Services\Setup\Http\Response;
use Acms\Services\Setup\SetupSession;

/**
 * SetupTool を ADR の Action として実行する薄いオーケストレータ。
 *
 * 旧 Surfacer::__invoke が抱えていた「送信判定 → validate/business → 描画」の制御を、可変状態を持たない
 * 数行に落とす。Pipeline に渡す `callable(Request): Response` として振る舞い、未送信なら show()、送信なら
 * handle() を呼び、結果 ToolView を共有 Responder で Response 化する。
 */
final class ToolRunner
{
    public function __construct(
        private readonly SetupTool $tool,
        private readonly SetupSession $session,
        private readonly ToolResponder $responder = new ToolResponder(),
    ) {
    }

    public function __invoke(Request $request): Response
    {
        $view = $request->isSubmitted()
            ? $this->tool->handle($request, $this->session)
            : $this->tool->show($request);

        return $this->responder->render($this->tool->template(), $view, $this->session);
    }
}
