/**
 * Ma propre vérification, indépendante de celle de l'agent. Les trois blocs
 * sont-ils disjoints, et couvrent-ils exactement la fenêtre de la requête ?
 */
import { and, eq, lt, or, sql, inArray } from "drizzle-orm"

import { db } from "@/lib/db/client"
import { departments, positions, recurringTemplates, taskInstances } from "@/lib/db/schema"
import { teamOverview } from "@/lib/services/team"
import type { SignedIn } from "@/lib/services/session"

const TODAY = "2026-08-04"

const admin = (dept: string | null): SignedIn => ({
  personId: "00000000-0000-0000-0000-000000000000",
  employeeCode: "",
  name: "",
  positionTitle: null,
  department: dept,
  level: "admin",
  tier: "admin",
  language: "en",
})

const names = await db.select({ name: departments.name }).from(departments)

let late = 0
let today = 0
let waiting = 0
const seen = new Map<string, string[]>()

for (const { name } of names) {
  const view = await teamOverview(admin(name), { departments: [name], today: TODAY })
  if (!view) continue
  late += view.late.length
  today += view.dueToday.length
  waiting += view.waitingCheck.length
  for (const [bucket, rows] of [
    ["late", view.late],
    ["dueToday", view.dueToday],
    ["waiting", view.waitingCheck],
  ] as const) {
    for (const r of rows) seen.set(r.id, [...(seen.get(r.id) ?? []), bucket])
  }
}

console.log({ late, today, waiting, total: late + today + waiting })
console.log("ids vus plus d'une fois :", [...seen].filter(([, b]) => b.length > 1).length)

// La même fenêtre, comptée par une requête écrite indépendamment du service.
const [window] = await db
  .select({ n: sql<number>`count(*)::int` })
  .from(taskInstances)
  .innerJoin(recurringTemplates, eq(recurringTemplates.id, taskInstances.recurringTemplateId))
  .innerJoin(positions, eq(positions.id, recurringTemplates.positionId))
  .innerJoin(departments, eq(departments.id, positions.departmentId))
  .where(
    or(
      eq(taskInstances.dueDate, TODAY),
      and(
        lt(taskInstances.dueDate, TODAY),
        inArray(taskInstances.status, ["todo", "started", "finished", "missed"]),
      ),
    ),
  )
console.log("fenêtre comptée à part :", window?.n)

// Un responsable ne doit pas pouvoir élargir sa vue par l'URL.
const manager: SignedIn = {
  personId: "00000000-0000-0000-0000-000000000000",
  employeeCode: "",
  name: "",
  positionTitle: null,
  department: "Casting",
  level: "manager",
  tier: "manager",
  language: "en",
}
const widened = await teamOverview(manager, {
  departments: ["Top management"],
  today: TODAY,
})
console.log("responsable de Casting demandant Top management :", widened?.departments)

// Un admin peut en tenir plusieurs, et le total doit être la somme.
const together = await teamOverview(admin("Casting"), {
  departments: ["Casting", "Top management", "Sample"],
  today: TODAY,
})
console.log("trois departements ensemble :", {
  departments: together?.departments,
  late: together?.late.length,
  today: together?.dueToday.length,
  waiting: together?.waitingCheck.length,
})

// Doublon dans l'URL : il ne doit pas compter deux fois.
const doubled = await teamOverview(admin("Casting"), {
  departments: ["Sample", "Sample"],
  today: TODAY,
})
const alone = await teamOverview(admin("Casting"), {
  departments: ["Sample"],
  today: TODAY,
})
console.log("Sample deux fois vs une fois :", {
  deux: doubled?.late.length,
  une: alone?.late.length,
  departements: doubled?.departments,
})

process.exit(0)
