/** Ma vérification : les six champs arrivent-ils, et la portée tient-elle ? */
import { eq, sql } from "drizzle-orm"

import { db } from "@/lib/db/client"
import { departments, people, positions, recurringTemplates } from "@/lib/db/schema"
import { createDuty, assignablePositions } from "@/lib/services/duties"
import type { SignedIn } from "@/lib/services/session"

const [before] = await db.select({ n: sql<number>`count(*)::int` }).from(recurringTemplates)
console.log("consignes avant :", before?.n)

const [m] = await db
  .select({ id: people.id, code: people.employeeCode, dept: departments.name, level: positions.level })
  .from(people)
  .innerJoin(positions, eq(positions.id, people.positionId))
  .innerJoin(departments, eq(departments.id, positions.departmentId))
  .where(eq(people.username, "malai"))
if (!m) throw new Error("malai introuvable")

const user: SignedIn = {
  personId: m.id, employeeCode: m.code, name: "", positionTitle: null,
  department: m.dept, level: m.level, tier: "manager", language: "en",
}

const positionsFor = await assignablePositions(user)
const target = positionsFor[0]
if (!target) throw new Error("aucun poste assignable")

// Quelqu'un d'un autre département, qui ne doit pas passer comme vérificateur.
const [outsider] = await db
  .select({ id: people.id })
  .from(people)
  .innerJoin(positions, eq(positions.id, people.positionId))
  .innerJoin(departments, eq(departments.id, positions.departmentId))
  .where(sql`${departments.name} <> ${m.dept} and ${people.archivedAt} is null`)
  .limit(1)

console.log()
console.log("=== la portée refuse-t-elle un vérificateur d'ailleurs ? ===")
console.log(
  await createDuty(user, {
    positionId: target.id,
    description: "sonde de verification, a supprimer",
    occurrence: "daily",
    checkerPersonId: m.id,
    verifierPersonId: outsider!.id,
  } as Parameters<typeof createDuty>[1]),
)

console.log()
console.log("=== les six champs arrivent-ils ? ===")
const made = await createDuty(user, {
  positionId: target.id,
  description: "sonde des six champs, a supprimer",
  occurrence: "monthly",
  dayOfMonth: 15,
  checkerPersonId: m.id,
  verifierPersonId: m.id,
  reportToDeliver: "un rapport",
  wiSopUrl: "WI-TEST-1",
  reportExampleUrl: "https://exemple.local/x.xlsx",
  timeToDoMinutes: 25,
  customerTag: "CUST-TEST",
} as Parameters<typeof createDuty>[1])
console.log("création :", made)

const [row] = await db
  .select({
    v: recurringTemplates.verifierPersonId,
    r: recurringTemplates.reportToDeliver,
    s: recurringTemplates.wiSopUrl,
    e: recurringTemplates.reportExampleUrl,
    t: recurringTemplates.timeToDoMinutes,
    c: recurringTemplates.customerTag,
  })
  .from(recurringTemplates)
  .where(eq(recurringTemplates.description, "sonde des six champs, a supprimer"))
console.log("relu :", row)

console.log()
console.log("=== le jour du mois est-il borné ? ===")
for (const d of [0, 32, 99, 1, 31]) {
  const r = await createDuty(user, {
    positionId: target.id,
    description: `sonde jour ${d}, a supprimer`,
    occurrence: "monthly",
    dayOfMonth: d,
    checkerPersonId: m.id,
  } as Parameters<typeof createDuty>[1])
  console.log(`  jour ${String(d).padStart(2)} :`, r.ok ? "accepté" : r.reason)
}

// Remise en état : tout ce que cette sonde a créé.
const removed = await db
  .delete(recurringTemplates)
  .where(sql`${recurringTemplates.description} like '%, a supprimer'`)
  .returning({ id: recurringTemplates.id })
console.log()
console.log("supprimées :", removed.length)
const [after] = await db.select({ n: sql<number>`count(*)::int` }).from(recurringTemplates)
console.log("consignes après :", after?.n, "| identique :", before?.n === after?.n)

process.exit(0)
