/**
 * Ma vérification, écrite indépendamment de celle de l'agent.
 * Les compteurs, le repliement des séries, et la complétion.
 */
import { and, eq, gte, inArray, lte, sql } from "drizzle-orm"

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

const TODAY = "2026-08-04"
const FROM = "2026-07-06" // today - 29

const admin = (dept: string): 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)).map((d) => d.name)

let late = 0
let grouped = 0
let today = 0
let waiting = 0
const seen = new Set<string>()

for (const name of names) {
  const v = await teamOverview(admin(name), { departments: [name], today: TODAY })
  if (!v) continue
  late += v.late.length
  today += v.dueToday.length
  waiting += v.waitingCheck.length
  grouped += groupLate(v.late).length
  for (const r of [...v.late, ...v.dueToday, ...v.waitingCheck]) seen.add(r.id)
}

console.log({ late, grouped, today, waiting, distincts: seen.size })

// Le repliement, compté par SQL sur (modele, responsable).
const [runs] = await db
  .select({ n: sql<number>`count(*)::int` })
  .from(
    db
      .select({ t: taskInstances.recurringTemplateId, p: taskInstances.assigneePersonId })
      .from(taskInstances)
      .where(
        and(
          sql`${taskInstances.dueDate} < ${TODAY}`,
          inArray(taskInstances.status, ["todo", "started", "missed"]),
        ),
      )
      .groupBy(taskInstances.recurringTemplateId, taskInstances.assigneePersonId)
      .as("r"),
  )
console.log("séries comptées par SQL :", runs?.n)

// La complétion, requête écrite à part.
for (const name of ["Top management", "Accounting", "CAD Design"]) {
  const [row] = await db
    .select({
      due: sql<number>`count(*)::int`,
      done: sql<number>`count(*) filter (where ${taskInstances.status} in ('finished','checked'))::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(
      and(
        eq(departments.name, name),
        gte(taskInstances.dueDate, FROM),
        lte(taskInstances.dueDate, TODAY),
      ),
    )
  const v = await teamOverview(admin(name), { departments: [name], today: TODAY })
  const [head] = await db
    .select({ n: sql<number>`count(*)::int` })
    .from(people)
    .innerJoin(positions, eq(positions.id, people.positionId))
    .innerJoin(departments, eq(departments.id, positions.departmentId))
    .where(eq(departments.name, name))
  console.log(name, {
    sql: row,
    ecran: v?.completion,
    effectifSql: head?.n,
    effectifEcran: v?.headcount,
  })
}

// Un responsable ne peut toujours pas élargir.
const manager: SignedIn = { ...admin("Casting"), level: "manager", tier: "manager" }
const widened = await teamOverview(manager, {
  departments: ["Top management", "Accounting"],
  today: TODAY,
})
console.log("responsable élargissant :", widened?.departments)

process.exit(0)
