import { beforeAll, expect, test } from "bun:test";
import { eq } from "drizzle-orm";
import { keywords } from "@/lib/db/domain-schema";
import { db } from "../src/db";
import type { CanonicalKeyword } from "../src/types";
import { upsertCanonical } from "../src/upsert";
import { ensureTestSite, TEST_SITE as SITE } from "./fixtures/site";

beforeAll(ensureTestSite);
test("upsertCanonical creates new + merges metrics per source", async () => {
  const slug = `zzqa-${Date.now()}`;
  const id = `${SITE}-${slug}`;
  const row: CanonicalKeyword = {
    slug,
    term: "zz qa",
    lang: "en",
    country: "US",
    intent: ["commercial"],
    serpFeatures: [],
    primarySource: "semrush",
    metrics: {
      volume: 10,
      kd: 5,
      cpc: 1,
      growthPct: null,
      competitiveDensity: 0.2,
      numberOfResults: 100,
      updatedAt: new Date().toISOString(),
    },
  };
  await upsertCanonical(SITE, [row]);
  const k = (await db.select().from(keywords).where(eq(keywords.id, id)))[0];
  expect(k.metrics.semrush?.volume).toBe(10);
  await upsertCanonical(SITE, [
    {
      ...row,
      primarySource: "mangools",
      metrics: { ...row.metrics, volume: 20 },
    },
  ]);
  const k2 = (await db.select().from(keywords).where(eq(keywords.id, id)))[0];
  expect(k2.metrics.semrush?.volume).toBe(10); // preserved
  expect(k2.metrics.mangools?.volume).toBe(20); // merged, not overwritten
  await db.delete(keywords).where(eq(keywords.id, id));
});
