// src/lib/keywords/enrich-status.ts — rail de statut d'enrichissement par
// mot-clé, bas-niveau et provider-agnostique. `server-only` (PAS "use server")
// : ce module n'est jamais exposé au réseau — la garde tenancy vit dans la
// couche action au-dessus (enrich-status-actions.ts). Il se contente d'un
// merge/retrait jsonb SQL-side sur `keywords.enrichment`, chunké sous le cap de
// bind-params, no-op sur tableau vide. Chaque provider porte SA clé : poser
// mangools ne touche jamais seranking (et réciproquement).
import "server-only";
import { inArray, sql } from "drizzle-orm";
import { chunk } from "@/lib/db/chunk";
import { db } from "@/lib/db/client";
import { keywords } from "@/lib/db/domain-schema";
import type { EnrichState, KeywordSource } from "./types";

/**
 * Pose (ou met à jour) l'état d'enrichissement du `provider` sur chaque
 * mot-clé. Merge jsonb `enrichment || {provider: state}` : ne remplace QUE la
 * clé du provider, laissant intacts les états des autres providers déjà
 * présents. Chunké par 500 ids (cap bind-params). No-op sur tableau vide
 * (aucune requête).
 */
export async function setEnrichStatus(
  keywordIds: string[],
  provider: KeywordSource,
  state: EnrichState,
): Promise<void> {
  if (keywordIds.length === 0) return;
  const patch = JSON.stringify({ [provider]: state });
  for (const slice of chunk(keywordIds, 500)) {
    await db
      .update(keywords)
      .set({ enrichment: sql`${keywords.enrichment} || ${patch}::jsonb` })
      .where(inArray(keywords.id, slice));
  }
}

/**
 * Retire LA clé du `provider` de l'état d'enrichissement (opérateur jsonb
 * `enrichment - 'provider'`), sans toucher aux autres providers. Chunké par
 * 500 ids. No-op sur tableau vide (aucune requête).
 */
export async function clearEnrichStatus(
  keywordIds: string[],
  provider: KeywordSource,
): Promise<void> {
  if (keywordIds.length === 0) return;
  for (const slice of chunk(keywordIds, 500)) {
    await db
      .update(keywords)
      .set({ enrichment: sql`${keywords.enrichment} - ${provider}::text` })
      .where(inArray(keywords.id, slice));
  }
}
