import { openDB, type IDBPDatabase } from "idb";
import type { Toepassingsgebied, Thema, Annotatie } from "@/data/regelgeving";

const DB_NAME = "notary-regelgeving";
const DB_VERSION = 1;

export interface ArtikelOpslag {
  id: string;
  nummer: string;
  titel?: string;
  tekst: string;
  volledigeTekst?: string;
  trefwoorden: string[];
  gewijzigd?: string;
}

export interface GebruikersWetOpslag {
  id: string;
  code: string;
  naam: string;
  volledigeNaam: string;
  toepassingsgebied: Toepassingsgebied;
  themas: Thema[];
  bron: string;
  versie: string;
  artikels: ArtikelOpslag[];
  aangemaakt: string;
  aangepast: string;
}

export interface ActualiteitStatus {
  wetId: string;
  datumGecontroleerd: string;
  gepubliceerdOp?: string;
  isActueel: boolean;
  melding?: string;
}

export interface VolledigeTekstOpslag {
  // key: "${wetId}:${artikelId}"
  sleutel: string;
  wetId: string;
  artikelId: string;
  tekst: string;
  aangepast: string;
}

type NotaryDB = {
  gebruikersWetten: {
    key: string;
    value: GebruikersWetOpslag;
  };
  annotaties: {
    key: string;
    value: Annotatie;
    indexes: { "by-wet-artikel": [string, string] };
  };
  bladwijzers: {
    key: string;
    value: { artikelId: string };
  };
  actualiteitStatus: {
    key: string;
    value: ActualiteitStatus;
  };
  volledigeTeksten: {
    key: string;
    value: VolledigeTekstOpslag;
    indexes: { "by-wet": string };
  };
};

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

export function getDb(): Promise<IDBPDatabase<NotaryDB>> {
  if (!dbPromise) {
    dbPromise = openDB<NotaryDB>(DB_NAME, DB_VERSION, {
      upgrade(db) {
        if (!db.objectStoreNames.contains("gebruikersWetten")) {
          db.createObjectStore("gebruikersWetten", { keyPath: "id" });
        }
        if (!db.objectStoreNames.contains("annotaties")) {
          const store = db.createObjectStore("annotaties", { keyPath: "id" });
          store.createIndex("by-wet-artikel", ["wetId", "artikelId"]);
        }
        if (!db.objectStoreNames.contains("bladwijzers")) {
          db.createObjectStore("bladwijzers", { keyPath: "artikelId" });
        }
        if (!db.objectStoreNames.contains("actualiteitStatus")) {
          db.createObjectStore("actualiteitStatus", { keyPath: "wetId" });
        }
        if (!db.objectStoreNames.contains("volledigeTeksten")) {
          const store = db.createObjectStore("volledigeTeksten", { keyPath: "sleutel" });
          store.createIndex("by-wet", "wetId");
        }
      },
    });
  }
  return dbPromise;
}
