/**
 * ★削除済み（論理削除）の施設・清掃エリアの行は、全画面で出さない★（ユーザー決定 2026-10-19。指示書BB U1・D-182。D-180 U8 を全画面に広げた）。
 * ★`deleted_at` が NULL でなければ削除済み（日時の値によらない）★。
 *
 * - ★正★: `isVisibleFacilitySection()`（列を運ぶ読み取り — `robot_error_reports` — が使う。D-180 と同じ）
 * - ★写し★: `FACILITY_SECTION_VISIBLE_WHERE`（Prisma のリレーション条件。`clean_timetables` / `clean_timetable_histories` /
 *   `clean_schedules` / `clean_task_reports` / `robot_error_reports` の `where` に混ぜる）。
 *   ★列を運ばない読み取りは、この写しだけで外す★（`IS NULL` は SQL と JS で意味が同じ。fixtures に削除の概念が無い。指示書BB D2）
 * ★施設名・分類 → 施設ID の解決は `deleted_at` で絞らない（罠7）★ — 解決は行の可視性と別の責務。
 *   削除済みの施設名で検索すると施設ID に解決され、その行はこの条件で外れて0件になる（指示書BB D3）
 */
import type { Prisma } from "@/lib/generated/prisma/client";

/** 可視性の判定に要る列（`facility` / `section` の `deleted_at`） */
export interface FacilitySectionVisibilitySource {
  facility: { deleted_at: Date | null };
  section: { deleted_at: Date | null };
}

/** ★行の施設・清掃エリアがどちらも削除済みでなければ見える（正）★ */
export function isVisibleFacilitySection(row: FacilitySectionVisibilitySource): boolean {
  return row.facility.deleted_at === null && row.section.deleted_at === null;
}

/**
 * ★SQL 側の写し★（`isVisibleFacilitySection()` と同じ規則）。
 * ★各モデルの `where` に混ぜても型が通ることを `satisfies` で確かめる★（中身は同じ1つのオブジェクト。指示書BB 2-1）
 */
export const FACILITY_SECTION_VISIBLE_WHERE = {
  facility: { deleted_at: null },
  section: { deleted_at: null },
} as const satisfies Prisma.CleanTimetableWhereInput &
  Prisma.CleanTimetableHistoryWhereInput &
  Prisma.CleanScheduleWhereInput &
  Prisma.CleanTaskReportWhereInput &
  Prisma.RobotErrorReportWhereInput;
