// src/lib/backlink/domain-profile-queries.test.ts — integration, gated on DB_TESTS=1.
import { beforeEach, describe, expect, mock, test } from "bun:test";

mock.module("server-only", () => ({}));
const RUN_DB = process.env.DB_TESTS === "1";

describe.skipIf(!RUN_DB)("domain profile queries (postgres)", () => {
  let db: typeof import("@/lib/db/client").db;
  let schema: typeof import("@/lib/db/domain-schema");
  let q: typeof import("./domain-profile-queries");

  beforeEach(async () => {
    ({ db } = await import("@/lib/db/client"));
    schema = await import("@/lib/db/domain-schema");
    q = await import("./domain-profile-queries");
    const { assertTestDb } = await import("@/lib/db/assert-test-db");
    await assertTestDb();
    await db.delete(schema.domainBacklinks);
    await db.delete(schema.sites);
    await db.insert(schema.sites).values({
      id: "site-a",
      orgId: "demo-org",
      ownerUserId: "seed-owner",
      name: "A",
      primaryLanguage: "fr",
      languages: [],
      targetCountries: ["FR"],
    });
    const mk = (
      i: number,
      over: Partial<typeof schema.domainBacklinks.$inferInsert>,
    ) => ({
      id: `site-a:${i}`,
      siteId: "site-a",
      sourceUrl: `https://d${i}.com/p`,
      sourceDomain: `d${i}.com`,
      targetUrl: "https://a.fr/",
      placement: "text",
      ...over,
    });
    await db
      .insert(schema.domainBacklinks)
      .values([
        mk(1, { authority: 90, nofollow: false, sitewide: true, isNew: true }),
        mk(2, { authority: 50, nofollow: true, isLost: true }),
        mk(3, { authority: 10, nofollow: false, sourceDomain: "d1.com" }),
      ]);
  });

  test("getDomainProfileStats aggregates counts + percentages + distinct domains", async () => {
    const s = await q.getDomainProfileStats("site-a");
    expect(s.backlinks).toBe(3);
    expect(s.refDomains).toBe(2); // d1.com (x2) + d2.com
    expect(s.dofollowPct).toBe(67); // 2/3
    expect(s.newCount).toBe(1);
    expect(s.lostCount).toBe(1);
  });

  test("getDomainBacklinksPage filters + sorts by authority + totals", async () => {
    const all = await q.getDomainBacklinksPage("site-a", {
      page: 0,
      pageSize: 50,
    });
    expect(all.total).toBe(3);
    expect(all.rows[0].authority).toBe(90); // desc
    const dofollow = await q.getDomainBacklinksPage("site-a", {
      dofollow: true,
      page: 0,
      pageSize: 50,
    });
    expect(dofollow.total).toBe(2);
    const lost = await q.getDomainBacklinksPage("site-a", {
      status: "lost",
      page: 0,
      pageSize: 50,
    });
    expect(lost.total).toBe(1);
  });
});
