import { getDb } from "./regelgeving-db";

export interface RegelgevingExport {
  versie: 1;
  geexporteerdOp: string;
  gebruikersWetten: unknown[];
  annotaties: unknown[];
  bladwijzers: unknown[];
  volledigeTeksten: unknown[];
  actualiteitStatussen: unknown[];
}

export async function exporteerNaarJson(): Promise<void> {
  const db = await getDb();
  const [gebruikersWetten, annotaties, bladwijzers, volledigeTeksten, actualiteitStatussen] =
    await Promise.all([
      db.getAll("gebruikersWetten"),
      db.getAll("annotaties"),
      db.getAll("bladwijzers"),
      db.getAll("volledigeTeksten"),
      db.getAll("actualiteitStatus"),
    ]);

  const data: RegelgevingExport = {
    versie: 1,
    geexporteerdOp: new Date().toISOString(),
    gebruikersWetten,
    annotaties,
    bladwijzers,
    volledigeTeksten,
    actualiteitStatussen,
  };

  const blob = new Blob([JSON.stringify(data, null, 2)], { type: "application/json" });
  const url = URL.createObjectURL(blob);
  const a = document.createElement("a");
  a.href = url;
  a.download = `notary-ai-backup-${new Date().toISOString().slice(0, 10)}.json`;
  a.click();
  URL.revokeObjectURL(url);
}

export async function importeerVanuitJson(bestand: File): Promise<{ aantalWetten: number; aantalAnnotaties: number }> {
  const tekst = await bestand.text();
  let data: RegelgevingExport;
  try {
    data = JSON.parse(tekst) as RegelgevingExport;
  } catch {
    throw new Error("Ongeldig bestand — geen geldige JSON.");
  }
  if (data.versie !== 1) {
    throw new Error(`Onbekend exportformaat (versie ${(data as {versie: unknown}).versie}).`);
  }

  const db = await getDb();
  const tx = db.transaction(
    ["gebruikersWetten", "annotaties", "bladwijzers", "volledigeTeksten", "actualiteitStatus"],
    "readwrite"
  );

  // eslint-disable-next-line @typescript-eslint/no-explicit-any
  const put = (store: any, items: unknown[]) => items.map((item) => store.put(item));
  await Promise.all([
    ...put(tx.objectStore("gebruikersWetten"), data.gebruikersWetten),
    ...put(tx.objectStore("annotaties"), data.annotaties),
    ...put(tx.objectStore("bladwijzers"), data.bladwijzers),
    ...put(tx.objectStore("volledigeTeksten"), data.volledigeTeksten),
    ...put(tx.objectStore("actualiteitStatus"), data.actualiteitStatussen),
  ]);
  await tx.done;

  return {
    aantalWetten: data.gebruikersWetten.length,
    aantalAnnotaties: data.annotaties.length,
  };
}
