import { invoke } from "@tauri-apps/api/core"; import type { BankAccount, Client, DraftSummary, Invoice, InvoiceInput, InvoiceSeries, InvoiceSummary, Settings, } from "./types"; import type { LogoAsset } from "./logo"; export interface ArchiveStatus { archived: boolean; sha256?: string; fingerprint?: string; archivedAt?: string; } export const api = { getSettings: () => invoke("get_settings"), saveSettings: (settings: Settings) => invoke("save_settings", { settings }), listBanks: () => invoke("list_banks"), saveBank: (bank: BankAccount) => invoke("save_bank", { bank }), deleteBank: (id: number) => invoke("delete_bank", { id }), getActiveSeries: () => invoke("get_active_series"), listSeries: () => invoke("list_series"), startNewSeries: (prefix: string, padding: number) => invoke("start_new_series", { prefix, padding }), listClients: () => invoke("list_clients"), saveClient: (client: Client) => invoke("save_client", { client }), deleteClient: (id: number) => invoke("delete_client", { id }), peekNextInvoiceNumber: () => invoke("peek_next_invoice_number"), issueInvoice: (input: InvoiceInput, renderPrefs: object) => invoke("issue_invoice", { input, renderPrefs }), cancelInvoice: (id: number, reason: string) => invoke("cancel_invoice", { id, reason }), listInvoices: () => invoke("list_invoices"), getInvoice: (id: number) => invoke("get_invoice", { id }), saveDraft: (id: number | null, payload: unknown) => invoke("save_draft", { id, payload }), listDrafts: () => invoke("list_drafts"), getDraft: (id: number) => invoke("get_draft", { id }), deleteDraft: (id: number) => invoke("delete_draft", { id }), importAsset: (sourcePath: string, kind: string) => invoke("import_asset", { sourcePath, kind }), saveAssetBytes: (kind: string, fileName: string, dataBase64: string) => invoke("save_asset_bytes", { kind, fileName, dataBase64 }), importLogo: (sourcePath: string) => invoke("import_logo", { sourcePath }), saveLogoBytes: (fileName: string, dataBase64: string) => invoke("save_logo_bytes", { fileName, dataBase64 }), ensureLogoDerived: () => invoke("ensure_logo_derived"), removeLogo: () => invoke("remove_logo"), readAssetDataUri: (path: string) => invoke("read_asset_data_uri", { path }), removeAsset: (path: string) => invoke("remove_asset", { path }), // Raw-body commands: the payload is the bytes themselves (no base64); metadata goes in headers. // Header values must be visible ASCII, hence the encodeURIComponent on paths. archivePdf: (invoiceId: number, bytes: Uint8Array, fingerprint: string) => invoke("archive_pdf", bytes, { headers: { "x-invoice-id": String(invoiceId), "x-fingerprint": fingerprint }, }), readArchive: async (invoiceId: number): Promise => new Uint8Array(await invoke("read_archive", { invoiceId })), archiveStatus: (invoiceId: number) => invoke("archive_status", { invoiceId }), writeExportFile: (path: string, bytes: Uint8Array) => invoke("write_export_file", bytes, { headers: { "x-path": encodeURIComponent(path) } }), getLastExportDir: () => invoke("get_last_export_dir"), revealInFolder: (path: string) => invoke("reveal_in_folder", { path }), openFile: (path: string) => invoke("open_file", { path }), };