// src/lib/backlink/global-actions.ts — god-mode actions for the curated global catalog.
"use server";
import { and, asc, eq, inArray } from "drizzle-orm";
import { revalidatePath } from "next/cache";
import { getActiveOrgId } from "@/lib/active-org";
import { assertSuperAdmin } from "@/lib/auth/super-admin";
import { organization } from "@/lib/db/auth-schema";
import { db } from "@/lib/db/client";
import { domainRatings, linkSources } from "@/lib/db/domain-schema";
import type { LinkSource } from "./types";

const RESERVOIR_PATH = "/backlink/reservoir";

/** Flag/unflag a source of the active org as part of the global catalog. */
export async function setSourceGlobalAction(
  sourceId: string,
  global: boolean,
): Promise<{ ok: boolean }> {
  await assertSuperAdmin();
  const orgId = await getActiveOrgId();
  const updated = await db
    .update(linkSources)
    .set({ global })
    .where(and(eq(linkSources.id, sourceId), eq(linkSources.orgId, orgId)))
    .returning({ id: linkSources.id });
  if (updated.length === 0) return { ok: false };
  revalidatePath(RESERVOIR_PATH);
  return { ok: true };
}

/** God-mode read: every org's sources, with the org name (sorted org → platform). */
export async function getAllOrgsSourcesAction(): Promise<
  (LinkSource & { orgName: string })[]
> {
  await assertSuperAdmin();
  const rows = await db
    .select({ source: linkSources, orgName: organization.name })
    .from(linkSources)
    .innerJoin(organization, eq(linkSources.orgId, organization.id))
    .orderBy(asc(organization.name), asc(linkSources.platform));

  const domains = [...new Set(rows.map((r) => r.source.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]));

  return rows.map(({ source: r, orgName }) => ({
    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,
    orgName,
  }));
}
