<?php

declare(strict_types=1);

namespace Acms\Services\Setup;

/**
 * インストーラー再実行ガードの核となる判定。
 *
 * インストールはセッションに状態を持たず、全ステップを POST の hidden で持ち回る設計で、
 * Step_5 で blog_id=1 が作られた時点で isInstalled() は true になる。
 * このため「インストール済みなら一律停止」にすると正規フローの最終段 Step_6 が壊れる。
 * そこで「未インストールなら常に許可」「インストール済みは有効な CSRF トークンを持つ
 * 正規セッションのみ許可（＝外部からの再実行を遮断）」という判定に切り出す。
 *
 * 状態（isInstalled の真偽・トークンの有効性）の取得は呼び出し側に委ね、本クラスは
 * 真偽の組み合わせから可否を返すだけの純粋ロジックとする。
 *
 * ブラウザセッション＋ CSRF トークンという Web 固有の概念に基づく判定のため
 * `Acms\Services\Setup` に置く（CLI 版インストーラーでは `--force` 等の別の再実行ガード方式になる想定で、
 * このクラス自体は再利用されない）。
 */
final class InstallAccessGuard
{
    /**
     * インストーラーへのアクセスを許可してよいか。
     *
     * @param bool $isInstalled すでにインストール済みか（blog_id=1 の存在等で判定）
     * @param bool $hasValidToken 有効な setup CSRF トークンを持つ正規セッションか
     */
    public function isAllowed(bool $isInstalled, bool $hasValidToken): bool
    {
        return !$isInstalled || $hasValidToken;
    }
}
