/** Local Hash & Checksum service (`local.hash`). File access only through opaque selection tokens. */
import { call, subscribeStrict } from "../transport";
import type { Payload } from "../types";

export const hashing = Object.freeze({
  getAlgorithms: () => call<Payload[]>("module_hashing_algorithms", "plugin:hashing:algorithms"),
  selectFiles: (multiple = false) => call<Payload>("module_hashing_select_files", "plugin:hashing:selectFiles", { multiple }),
  selectDirectory: () => call<Payload>("module_hashing_select_directory", "plugin:hashing:selectDirectory"),
  selectManifest: () => call<Payload>("module_hashing_select_manifest", "plugin:hashing:selectManifest"),
  selectManifestDestination: (suggestedName?: string) => call<Payload>("module_hashing_select_manifest_destination", "plugin:hashing:selectManifestDestination", { suggestedName }),
  start: (payload: Payload) => call<Payload>("module_hashing_start", "plugin:hashing:start", payload),
  verify: (payload: Payload) => call<Payload>("module_hashing_verify", "plugin:hashing:verify", payload),
  compare: (payload: Payload) => call<Payload>("module_hashing_compare", "plugin:hashing:compare", payload),
  generateManifest: (payload: Payload) => call<Payload>("module_hashing_generate_manifest", "plugin:hashing:generateManifest", payload),
  verifyManifest: (payload: Payload) => call<Payload>("module_hashing_verify_manifest", "plugin:hashing:verifyManifest", payload),
  exportResults: (payload: Payload) => call<Payload>("module_hashing_export_results", "plugin:hashing:exportResults", payload),
  copyResult: (payload: Payload) => call<Payload>("module_hashing_copy_result", "plugin:hashing:copyResult", payload),
  status: (jobId: string) => call<Payload>("module_hashing_status", "plugin:hashing:status", { jobId }),
  cancel: (jobId: string) => call<Payload>("module_hashing_cancel", "plugin:hashing:cancel", { jobId }),
  onProgress: (callback: (job: Payload) => void) => subscribeStrict("module:hashing:progress", callback, "Progress")
});
