"use client";
import { useCallback, useMemo } from "react";
import { useGesynchroniseerdeOpslag } from "./useGesynchroniseerdeOpslag";
import { getKennisbankDb } from "@/lib/db/kennisbank-db";
import {
  combineerKennisbank,
  keurVoorstelGoed,
  type KennisItem,
} from "@/data/kennisbank";

async function lokaalLezen(): Promise<KennisItem[]> {
  const db = await getKennisbankDb();
  return db.getAll("items");
}

async function lokaalSchrijven(item: KennisItem): Promise<void> {
  const db = await getKennisbankDb();
  await db.put("items", item);
}

async function lokaalVerwijderen(id: string): Promise<void> {
  const db = await getKennisbankDb();
  await db.delete("items", id);
}

/**
 * Kennisbank-opslag: IndexedDB + kantoorbrede sync via /api/sync/kennisbank.
 * `kennisbank` is de samengevoegde actuele kennis (seed + opgeslagen items;
 * een opgeslagen item met hetzelfde id vervangt het seed-item).
 */
export function useKennisbankStorage() {
  const { items: opgeslagen, geladen, slaOp, verwijder } =
    useGesynchroniseerdeOpslag<KennisItem>(
      "/api/sync/kennisbank",
      lokaalLezen,
      lokaalSchrijven,
      lokaalVerwijderen
    );

  const kennisbank = useMemo(() => combineerKennisbank(opgeslagen), [opgeslagen]);

  /**
   * Keurt een voorstel goed: de inhoud wordt gevalideerd opgeslagen (onder het
   * bestaande id als het voorstel een bestaand item wijzigt) en het losse
   * voorstelrecord wordt daarna opgeruimd.
   */
  const keurGoed = useCallback(
    async (voorstel: KennisItem) => {
      const { item, verwijderId } = keurVoorstelGoed(voorstel, new Date().toISOString());
      await slaOp(item);
      if (verwijderId) await verwijder(verwijderId);
    },
    [slaOp, verwijder]
  );

  return { kennisbank, opgeslagen, geladen, slaOp, verwijder, keurGoed };
}
