import { describe, expect, it } from "vitest";

import { intersectFacilityIds } from "@/lib/facilities/intersect-ids";

/**
 * 指示書AK 段階3 ★§6-2★ — 施設名の絞り込みと分類の絞り込みの★積集合（AND）★。
 *
 * ★★指示書の期待値表6行をそのまま固定してある★★。
 *   ★最後の2行（積集合が空 / 片方が0件ヒット）が要★ — ★`null` にしないこと★。
 *   `null` にすると条件ごと消えて ★0件が全件表示に化けます★（落とし穴2）。
 */
describe("intersectFacilityIds（指示書AK 段階3 §6-2 の期待値表）", () => {
  it("#1 `null` × `null` → ★`null`★（どちらも未指定＝絞らない）", () => {
    expect(intersectFacilityIds(null, null)).toBeNull();
  });

  it("#2 `[1,2,3]` × `null` → `[1,2,3]`（片方だけ指定）", () => {
    expect(intersectFacilityIds([1, 2, 3], null)).toEqual([1, 2, 3]);
  });

  it("#3 `null` × `[2,3,4]` → `[2,3,4]`（片方だけ指定・逆向き）", () => {
    expect(intersectFacilityIds(null, [2, 3, 4])).toEqual([2, 3, 4]);
  });

  it("#4 `[1,2,3]` × `[2,3,4]` → ★`[2,3]`★（★和集合にしないこと★）", () => {
    expect(intersectFacilityIds([1, 2, 3], [2, 3, 4])).toEqual([2, 3]);
  });

  it("#5 ★`[1]` × `[2]` → `[]`★（★`null` にしないこと★。落とし穴2）", () => {
    const result = intersectFacilityIds([1], [2]);
    expect(result).toEqual([]);
    expect(result).not.toBeNull();
  });

  it("#6 ★`[]` × `[1,2]` → `[]`★（0件ヒットは0件のまま）", () => {
    const result = intersectFacilityIds([], [1, 2]);
    expect(result).toEqual([]);
    expect(result).not.toBeNull();
  });

  it("★`[]` × `null` は `[]`★（0件ヒットが「未指定」に化けないこと）", () => {
    expect(intersectFacilityIds([], null)).toEqual([]);
    expect(intersectFacilityIds(null, [])).toEqual([]);
  });

  it("★並び順は第1引数の順序を保つ★（理由なく並び替えない）", () => {
    expect(intersectFacilityIds([3, 1, 2], [2, 3])).toEqual([3, 2]);
  });

  it("★入力の配列を壊さない（純粋関数）★", () => {
    const a = [1, 2, 3];
    const b = [2, 3, 4];
    intersectFacilityIds(a, b);
    expect(a).toEqual([1, 2, 3]);
    expect(b).toEqual([2, 3, 4]);
  });
});
