/** Jetable. La complétion, et les actions par ligne, vérifiées séparément. */
import { and, eq, gte, inArray, lte, sql } from "drizzle-orm"

import { db } from "@/lib/db/client"
import {
  departments,
  people,
  positions,
  recurringTemplates,
  taskInstances,
} from "@/lib/db/schema"
import { get, signIn, visible } from "./probe"

const TODAY = "2026-08-04"
const FROM = "2026-07-06" // 30 jours inclus aujourd'hui : 4 août - 29

const DEPTS = ["Top management", "Accounting", "Accessory Center", "CAD Design"]

console.log("=== complétion, comptée en SQL, indépendamment du service ===")
for (const dept of DEPTS) {
  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(
        inArray(departments.name, [dept]),
        gte(taskInstances.dueDate, FROM),
        lte(taskInstances.dueDate, TODAY),
      ),
    )
  const pct = row!.due ? Math.round((row!.done / row!.due) * 100) : null
  console.log(`${dept}: ${row!.done}/${row!.due} = ${pct}%`)
}

console.log("\n=== effectifs, comptés en SQL ===")
for (const dept of DEPTS) {
  const [row] = 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(and(inArray(departments.name, [dept]), sql`${people.archivedAt} is null`))
  console.log(dept, row!.n)
}

console.log("\n=== quelles actions apparaissent, et pour qui ===")
const admin = await signIn("narin", "admin1")
const manager = await signIn("malai", "manager1")

const VERBS = [
  "Approve",
  "Send back",
  "Start",
  "Mark finished",
  "Send a reminder",
  "Report an issue",
  "Verify",
  "Close",
]

for (const [who, cookie, dept] of [
  ["admin narin", admin, "Accessory Center"],
  ["manager malai", manager, "Accessory Center"],
  ["admin narin", admin, "Top management"],
] as const) {
  for (const tab of ["today", "waiting"] as const) {
    const r = await get(cookie, `/team?dept=${encodeURIComponent(dept)}&tab=${tab}`)
    const text = visible(r.body)
    const found = VERBS.filter((v) => text.includes(v))
    console.log(`${who} · ${dept} · ${tab} →`, found.length ? found.join(", ") : "aucun bouton")
  }
}

// Un manager voit-il « Approve » sur une ligne dont il n'est pas le checker ?
console.log("\n=== la ligne dicte, pas le rang ===")
const waiting = await get(manager, "/team?tab=waiting")
const rows = (waiting.body.match(/<tbody[\s\S]*?<\/tbody>/) ?? [""])[0]
  .split("<tr")
  .slice(1)
console.log("lignes en attente :", rows.length)
for (const [i, row] of rows.entries()) {
  console.log(
    ` ligne ${i + 1} : approve=${row.includes("อนุมัติ") || row.includes("Approve")}`,
  )
}

process.exit(0)
