import { openDB, type IDBPDatabase } from "idb";
import type {
  Modeldocument,
  Modelonderdeel,
  Wijzigingsvoorstel,
  ModeldocumentVoorstel,
  BronDocument,
  OnderdeelHistoriek,
} from "@/data/modeldocumenten";

const DB_NAME = "notary-modeldocumenten";
const DB_VERSION = 5;

type ModeldocumentenDB = {
  onderdelen: {
    key: string;
    value: Modelonderdeel;
  };
  modellen: {
    key: string;
    value: Modeldocument;
  };
  voorstellen: {
    key: string;
    value: Wijzigingsvoorstel;
  };
  modelvoorstellen: {
    key: string;
    value: ModeldocumentVoorstel;
  };
  bronnen: {
    key: string;
    value: BronDocument;
  };
  onderdelenHistorie: {
    key: string;
    value: OnderdeelHistoriek;
  };
};

let dbPromise: Promise<IDBPDatabase<ModeldocumentenDB>> | null = null;

export function getModeldocumentenDb(): Promise<IDBPDatabase<ModeldocumentenDB>> {
  if (!dbPromise) {
    dbPromise = openDB<ModeldocumentenDB>(DB_NAME, DB_VERSION, {
      upgrade(db, oldVersion) {
        // Versie 1: initieel schema
        if (oldVersion < 1) {
          db.createObjectStore("onderdelen", { keyPath: "id" });
          db.createObjectStore("modellen", { keyPath: "id" });
        }
        // Versie 2: wijzigingsvoorstellen ter validatie door de notaris
        if (oldVersion < 2) {
          db.createObjectStore("voorstellen", { keyPath: "id" });
        }
        // Versie 3: voorstellen voor volledige modeldocumenten (via MCP)
        if (oldVersion < 3) {
          db.createObjectStore("modelvoorstellen", { keyPath: "id" });
        }
        // Versie 4: register van reeds verwerkte bronbestanden
        if (oldVersion < 4) {
          db.createObjectStore("bronnen", { keyPath: "id" });
        }
        // Versie 5: versiehistoriek van eigen modelonderdelen
        if (oldVersion < 5) {
          db.createObjectStore("onderdelenHistorie", { keyPath: "id" });
        }
        // Toekomstige versies: voeg hier migraties toe
      },
    });
  }
  return dbPromise;
}
