/**
 * GET /ds-agent/commands — 制御盤が指示を取りに来る（ロングポーリング。指示書AY 段階7-3。D2・D-179）
 *
 * 仕様の正は `d-watch-api.yaml` の /ds-agent/commands。認証は制御盤の Bearer だけ（`requireAgent()` で再検証）。
 * 指示があればすぐ 200、無ければ `wait` 秒で 204。★DB を読まない★（`USE_FIXTURES` に関係なく同じ動き）。
 */
import { NextResponse } from "next/server";
import { noContent } from "@/lib/ds-agent/agent-request";
import { getRelay } from "@/lib/ds-agent/relay";
import { ensureDsAgentLogging } from "@/lib/ds-agent/relay-log";
import { agentVersionOf, requireAgent } from "@/lib/ds-agent/require-agent";
import { parseAgentPollWait } from "@/lib/ds-logs/validate";
import { withRequestId } from "@/lib/logger";

export async function GET(request: Request) {
  return withRequestId(request, async () => {
    ensureDsAgentLogging();
    const auth = await requireAgent(request);
    if (!auth.ok) return auth.response;

    const wait = parseAgentPollWait(new URL(request.url).searchParams.get("wait"));
    if (!wait.ok) return NextResponse.json(wait.error, { status: wait.status });

    const command = await getRelay().poll(auth.serial, agentVersionOf(request), wait.query, request.signal);
    return command ? NextResponse.json(command) : noContent();
  });
}
