/**
 * GET /clean-logs/{id}/advice — 対応アドバイス（行展開時の推定原因＋確認アクション）
 *
 * 仕様の正は `d-watch-api.yaml` の /clean-logs/{id}/advice です。
 *
 * 判定（どのルールが該当するか）は `lib/judge/advice.ts`、
 * 文言は `lib/settings/advice.ts`（運用設定で編集された内容）から取得します。
 */
import { NextResponse } from "next/server";
import { parsePathId } from "@/lib/api/path-params";
import { adviceResponse } from "@/lib/clean-logs/advice-response";
import { db } from "@/lib/db";
import { logApiError } from "@/lib/logger/api";
import { withRequestId } from "@/lib/logger";
import type { ApiError, ErrorCode } from "@/lib/types";

const ROUTE = "/api/clean-logs/[id]/advice";

function errorBody(code: ErrorCode, message: string): ApiError {
  return { error: { code, message, details: null } };
}

function errorResponse(status: number, code: ErrorCode, message: string) {
  return NextResponse.json(errorBody(code, message), { status });
}

export async function GET(
  request: Request,
  { params }: { params: Promise<{ id: string }> }
) {
  return withRequestId(request, async () => {
    const { id } = await params;
    // ★`Number.parseInt` の前方一致に頼らない★（`lib/api/path-params.ts` 参照。
    //   `"12abc"` / `"1.9"` / `"-5"` が黙って通っていた。指示書AE 段階2-2 / D-123）
    const parsedId = parsePathId(id);
    if (!parsedId.ok) {
      return NextResponse.json(parsedId.error, { status: parsedId.status });
    }
    const logId = parsedId.query;

    let logs;
    try {
      // ★★1件だけ引く★★（指示書AC 段階3）— 以前は「範囲なし」で全件（実測3,178行）を
      //   読んでから `find()` していた。
      //   ★★連続日数は `loadConsecutiveInputs()` 経由なので正しいまま★★（段階1 の効果）—
      //   `cleanLogs()` の中で ★全期間を読む専用の1本★ が別に走るので、
      //   ★`id` で絞っても L3 が L1 に化けない★（指示書AC C-2）。
      //   ★★`facility_ids: []` を渡さないこと★★ — `[]` は「0件ヒット」の意味なので
      //   ★全部 404 になります★（罠1）。
      logs = await db.cleanLogs({
        id: logId,
        date_from: null,
        date_to: null,
        facility_ids: null,
      });
    } catch (e) {
      const body = errorBody("internal_error", "データの取得に失敗しました");
      logApiError({ route: ROUTE, method: "GET", body, status: 500, err: e });
      return NextResponse.json(body, { status: 500 });
    }

    // ★`db` が1件だけ返すようになっても `find()` は**残す**★（指示書AC C-5）—
    //   ★絞り込み規則の「正」はここ★で、SQL 側はその写し。
    //   ★★fixtures 版が `id` の扱いを間違えても 404 が壊れない保険★★にもなる。
    const log = logs.find((l) => l.id === logId);
    if (!log) {
      return errorResponse(404, "not_found", "指定された清掃ログが見つかりません");
    }

    // ★`clean_log_id` は `log.id` でなくパスの `logId` を渡す★ — `log.id` は型の上で null を含む
    //   （予定外の行。指示書BG §2-1）が、`find()` で `logId` と一致した行なので同じ値
    return adviceResponse(log, { route: ROUTE, logIds: { clean_log_id: logId } });
  });
}
