// src/lib/backlink/research-actions.ts — actions de prospection (multi-sites + planning).
"use server";
import { randomUUID } from "node:crypto";
import { and, eq, inArray } from "drizzle-orm";
import { revalidatePath } from "next/cache";
import { db } from "@/lib/db/client";
import { backlinks } from "@/lib/db/domain-schema";
import { assertSiteInActiveOrg } from "@/lib/sites/assert-site";
import { filterLinkSourceIdsForActiveOrg } from "./assert-link-source";

/** F4 — crée des prospects N sources × M sites (dédup par l'unique (source,site)). */
export async function assignProspectsAction(
  sourceIds: string[],
  siteIds: string[],
): Promise<{ created: number; skipped: number }> {
  await Promise.all(siteIds.map((s) => assertSiteInActiveOrg(s)));
  // Tenancy (audit sécu B1) — un linkSourceId d'une autre org est silencieusement
  // écarté avant tout insert (fail-closed bulk, même sémantique que les mots-clés).
  const validSourceIds = await filterLinkSourceIdsForActiveOrg(sourceIds);
  const pairs = validSourceIds.flatMap((s) => siteIds.map((t) => ({ s, t })));
  if (pairs.length === 0) return { created: 0, skipped: 0 };
  const inserted = await db
    .insert(backlinks)
    .values(
      pairs.map(({ s, t }) => ({
        id: randomUUID(),
        linkSourceId: s,
        siteId: t,
        status: "prospect" as const,
      })),
    )
    .onConflictDoNothing()
    .returning({ id: backlinks.id });
  revalidatePath("/backlink/recherche");
  revalidatePath("/backlink/reservoir");
  return { created: inserted.length, skipped: pairs.length - inserted.length };
}

/** F7 — push planning : prospects sélectionnés du site → planned (live/lost intacts). */
export async function pushProspectsToPlanningAction(
  siteId: string,
  sourceIds: string[],
): Promise<{ updated: number }> {
  await assertSiteInActiveOrg(siteId);
  if (sourceIds.length === 0) return { updated: 0 };
  const updated = await db
    .update(backlinks)
    .set({ status: "planned" })
    .where(
      and(
        eq(backlinks.siteId, siteId),
        inArray(backlinks.linkSourceId, sourceIds),
        eq(backlinks.status, "prospect"),
      ),
    )
    .returning({ id: backlinks.id });
  revalidatePath("/backlink/recherche");
  return { updated: updated.length };
}
