import type {
  KV,
  KvQuery,
  ObjectQuery,
  ObjectValue,
} from "../../plug-api/types.ts";
import { ttlCache } from "$lib/memory_cache.ts";
import { system } from "@silverbulletmd/silverbullet/syscalls";

export function indexObjects<T>(
  page: string,
  objects: ObjectValue<T>[],
): Promise<void> {
  return system.invokeFunction("index.indexObjects", page, objects);
}

export function batchSet(page: string, kvs: KV[]): Promise<void> {
  return system.invokeFunction("index.batchSet", page, kvs);
}

export function query(
  query: KvQuery,
): Promise<KV[]> {
  return system.invokeFunction("index.query", query);
}

export function queryObjects<T>(
  tag: string,
  query: ObjectQuery,
  ttlSecs?: number,
): Promise<ObjectValue<T>[]> {
  return ttlCache(
    query,
    () => system.invokeFunction("index.queryObjects", tag, query),
    ttlSecs, // no-op when undefined
  );
}

export function getObjectByRef<T>(
  page: string,
  tag: string,
  ref: string,
): Promise<T | undefined> {
  return system.invokeFunction("index.getObjectByRef", page, tag, ref);
}