import { prisma } from "../lib/prisma.js";
import { runIterativeI485AutofillLoop } from "../lib/i485-autofill-loop.js";

function getArgValue(flag: string) {
  const index = process.argv.indexOf(flag);
  if (index < 0) {
    return null;
  }
  return process.argv[index + 1] ?? null;
}

async function resolveClient() {
  const explicitClientId = getArgValue("--client-id");
  if (explicitClientId) {
    const [client] = await prisma.$queryRaw<Array<{
      id: string;
      law_firm_id: string;
      first_name: string;
      last_name: string;
    }>>`
      SELECT id, law_firm_id, first_name, last_name
      FROM clients
      WHERE id = ${explicitClientId}
      LIMIT 1
    `;
    return client ?? null;
  }

  const defaultNeedles = ["HOMAIRA", "HOSSAIN"];
  const [client] = await prisma.$queryRaw<Array<{
    id: string;
    law_firm_id: string;
    first_name: string;
    last_name: string;
  }>>`
    SELECT id, law_firm_id, first_name, last_name
    FROM clients
    WHERE UPPER(first_name) LIKE ${`%${defaultNeedles[0]}%`}
       OR UPPER(last_name) LIKE ${`%${defaultNeedles[1]}%`}
    ORDER BY created_at DESC
    LIMIT 1
  `;
  return client ?? null;
}

async function resolveActorUserId(lawFirmId: string) {
  const explicitUserId = getArgValue("--user-id");
  if (explicitUserId) {
    return explicitUserId;
  }

  const [membership] = await prisma.$queryRaw<Array<{ user_id: string }>>`
    SELECT wm.user_id
    FROM workspace_memberships wm
    JOIN users u ON u.id = wm.user_id
    WHERE wm.law_firm_id = ${lawFirmId}
      AND u.deleted_at IS NULL
      AND u.is_active = 1
    ORDER BY wm.is_default DESC, wm.joined_at ASC
    LIMIT 1
  `;

  return membership?.user_id ?? null;
}

async function main() {
  const client = await resolveClient();
  if (!client) {
    throw new Error("Unable to resolve the HOMAIRA client in the current database.");
  }

  const actorUserId = await resolveActorUserId(client.law_firm_id);
  if (!actorUserId) {
    throw new Error("Unable to resolve an active actor user for the client workspace.");
  }

  const report = await runIterativeI485AutofillLoop({
    lawFirmId: client.law_firm_id,
    clientId: client.id,
    actorUserId,
    targetCoverage: 0.8,
    maxRuntimeMs: 2 * 60 * 60 * 1000,
    onIteration: (summary) => {
      const payload = {
        iteration: summary.iteration,
        coverage: Number(summary.coverage.toFixed(4)),
        filled_fields: summary.filledFields,
        total_fields: summary.totalFields,
        missing_fields: summary.missingFields.slice(0, 40),
        improvements_applied: summary.improvementsApplied,
        runtime_ms: summary.runtimeMs,
      };
      console.log(JSON.stringify(payload, null, 2));
    },
  });

  console.log(JSON.stringify(report, null, 2));
}

main()
  .catch((error) => {
    console.error(error);
    process.exitCode = 1;
  })
  .finally(async () => {
    await prisma.$disconnect();
  });
