import { beforeAll, expect, test } from "bun:test";
import { randomUUID } from "node:crypto";
import { existsSync } from "node:fs";
import { join } from "node:path";
import { eq } from "drizzle-orm";
import { analyticsJobs, keywords } from "@/lib/db/domain-schema";
import { db } from "../src/db";
import { processJob } from "../src/worker";
import { ensureTestSite, TEST_SITE as SITE } from "./fixtures/site";

beforeAll(ensureTestSite);
test("processJob: duckdb → upsert → done → keeps local file", async () => {
  process.env.STORAGE_DRIVER = "local";
  const fixture = join(import.meta.dir, "fixtures", "semrush.csv");
  const id = randomUUID();
  await db.insert(analyticsJobs).values({
    id,
    siteId: SITE,
    source: "semrush",
    objectKey: fixture,
    status: "running",
  });
  const job = (
    await db.select().from(analyticsJobs).where(eq(analyticsJobs.id, id))
  )[0];
  await processJob(job);
  const done = (
    await db.select().from(analyticsJobs).where(eq(analyticsJobs.id, id))
  )[0];
  expect(done.status).toBe("done");
  expect(done.totals.read).toBe(3);
  const k = (
    await db
      .select()
      .from(keywords)
      .where(eq(keywords.id, `${SITE}-seo-audit`))
  )[0];
  expect(k?.metrics.semrush?.volume).toBe(1000);
  expect(existsSync(fixture)).toBe(true); // local driver never deletes
  // cleanup
  await db.delete(keywords).where(eq(keywords.id, `${SITE}-seo-audit`));
  await db.delete(keywords).where(eq(keywords.id, `${SITE}-link-building`));
  await db.delete(analyticsJobs).where(eq(analyticsJobs.id, id));
});
