// src/lib/backlink/queries.ts — server-side reads for the global backlink reservoir.
import { eq, inArray } from "drizzle-orm";
import { db } from "@/lib/db/client";
import { backlinks, domainRatings, linkSources } from "@/lib/db/domain-schema";
import type { LinkSource } from "./types";

export interface ReservoirData {
  sources: LinkSource[];
  /** sourceId -> siteIds that target it (any backlink status). */
  footprint: Record<string, string[]>;
}

/** The org-global reservoir directory + which sites already target each source. */
export async function getReservoir(orgId: string): Promise<ReservoirData> {
  const rows = await db
    .select()
    .from(linkSources)
    .where(eq(linkSources.orgId, orgId))
    .orderBy(linkSources.platform);

  const domains = [...new Set(rows.map((r) => r.domainNorm))];
  const drRows = domains.length
    ? await db
        .select({ domainNorm: domainRatings.domainNorm, dr: domainRatings.dr })
        .from(domainRatings)
        .where(inArray(domainRatings.domainNorm, domains))
    : [];
  const drByDomain = new Map(drRows.map((d) => [d.domainNorm, d.dr]));

  const sources: LinkSource[] = rows.map((r) => ({
    id: r.id,
    platform: r.platform,
    url: r.url,
    domainNorm: r.domainNorm,
    kind: r.kind,
    da: r.da,
    dr: drByDomain.get(r.domainNorm) ?? null,
    effort: r.effort,
    linkType: r.linkType,
    language: r.language,
    themes: r.themes,
    tags: r.tags,
    flags: r.flags,
    note: r.note ?? undefined,
    global: r.global,
  }));

  const sourceIds = rows.map((r) => r.id);
  const rels = sourceIds.length
    ? await db
        .select({
          linkSourceId: backlinks.linkSourceId,
          siteId: backlinks.siteId,
        })
        .from(backlinks)
        .where(inArray(backlinks.linkSourceId, sourceIds))
    : [];

  const footprint: Record<string, string[]> = {};
  for (const r of rels) {
    const list = footprint[r.linkSourceId] ?? [];
    list.push(r.siteId);
    footprint[r.linkSourceId] = list;
  }

  return { sources, footprint };
}
