/**
* fixtures 版 `prechecks()` の絞り込み(指示書AC ★段階4★。段階2 D-5 の作法をそのまま真似る)。
*
* ★★`USE_FIXTURES` の true/false で件数が変わってはいけない★★(指示書AC 禁止事項6)。
* Prisma 版が SQL に降ろした条件(日付範囲・施設ID)と ★同じ意味★ をここで再現します。
*
* ★絞り込み規則の「正」は `filterPrechecksByDate()`(`lib/prechecks/query.ts`)★ —
* ここも Prisma 側もその ★写し★ です(指示書AC C-5)。
* ★★`filterPrechecksByDate()` を外さないこと★★。
*
* ★★`scheduled_at`(=本清掃の予定時刻)で絞る★★ —
* Prisma 版が親の本清掃行の `start_at` で絞るのと同じ意味(`PrecheckDbQuery` の型コメント)。
* (旧: 出発失敗の行 `launch_failed` もあり、2種類を同じ条件で絞っていた。2026-10-29 に出発失敗の行を廃止)
* ★★`detected_at` で絞らないこと★★ — `severity: "precheck"` の行は
* `detected_at`(検知時刻)が予定時刻の60分前なので、★日をまたぐ行が消えます★。
*
* ★DBアクセスを混ぜない純粋関数★(テストから直接呼べるようにするため。
* `lib/db/fixture-clean-logs.ts` / `lib/db/fixture-area-completions.ts` と同じ流儀)。
*/
import type { PrecheckDbQuery, PrecheckItem } from "@/lib/types";
/**
* ★日付の比較は文字列のまま行う★ — `scheduled_at` は ISO8601(+09:00)なので
* ★先頭10文字が JST の日付そのもの★ になり、実行環境のタイムゾーンに依存しません
* (`filterPrechecksByDate()` / `filterFixtureCleanLogs()` と同じ作法)。
* ★`new Date()` を挟むと、Prisma 版が壁時計値で絞っているのと基準がずれます★。
*/
export function filterFixturePrechecks(
rows: readonly PrecheckItem[],
query: PrecheckDbQuery
): PrecheckItem[] {
return rows.filter((row) => {
const date = row.scheduled_at.slice(0, 10);
// ★★`!== null` で分岐すること★★(罠1と同じ形。`?` や `||` で書くと条件が静かに消える)
if (query.date_from !== null && date < query.date_from) return false;
// ★`date_to` はその日を**含む**(`dbDateRange()` の `lt` = 翌日 00:00 と同じ意味)★
if (query.date_to !== null && date > query.date_to) return false;
// ★★`!== null` で分岐すること★★(罠1)— `query.facility_ids?.length` と書くと
// `[]`(分類で絞って0件ヒット)が「指定なし=全件」に化ける。
// ★Prisma 版の `facility_id: { in: [...] }` と同じ意味★(禁止事項6)。
if (query.facility_ids !== null && !query.facility_ids.includes(row.facility_id)) {
return false;
}
return true;
});
}