import { DocumentsApi } from "omsorgcore-client-ts";
import { configFor, callApi } from "./apiClientHelpers.js";
import { API_BASE } from "./config.js";

// Kapselt /api/documents von omsorgCore (DocumentsController). Der generierte Client wird für
// list/upload/delete genutzt; der Download-Endpoint NICHT über DocumentsApi (dessen
// apiDocumentsIdDownloadGetRaw ist als VoidApiResponse generiert und verwirft den Response-Body),
// sondern per direktem fetch, analog zu genericApi.js für nicht-generierte Endpunkte.
export async function listDocuments(accessToken, { entityType, entityId } = {}) {
  const api = new DocumentsApi(configFor(accessToken));
  return callApi(api.apiDocumentsGetRaw({ entityType, entityId }));
}

export async function uploadDocument(accessToken, { entityType, entityId, category, description, fileName, contentType, data }) {
  const api = new DocumentsApi(configFor(accessToken));
  // data ist ein ArrayBuffer (aus file.arrayBuffer() im UploadDocumentDialog) - Blob
  // akzeptiert das im Browser direkt, kein Buffer.from(...) nötig (das war Node-spezifisch).
  const file = new Blob([data], { type: contentType || "application/octet-stream" });
  return callApi(api.apiDocumentsPostRaw({ entityType, entityId, category, description, file }));
}

export async function updateDocument(accessToken, id, payload) {
  const api = new DocumentsApi(configFor(accessToken));
  return callApi(api.apiDocumentsIdPutRaw({ id, updateDocumentRequest: payload }));
}

export async function deleteDocument(accessToken, id) {
  const api = new DocumentsApi(configFor(accessToken));
  return callApi(api.apiDocumentsIdDeleteRaw({ id }));
}

export async function downloadDocument(accessToken, id) {
  const headers = {};
  if (accessToken) headers.Authorization = `Bearer ${accessToken}`;

  let response;
  try {
    response = await fetch(`${API_BASE}/api/documents/${id}/download`, { headers });
  } catch (err) {
    return { ok: false, status: 0, data: null, error: err.message };
  }

  if (!response.ok) {
    return { ok: false, status: response.status, data: null };
  }

  const blob = await response.blob();
  return { ok: true, status: response.status, data: { blob } };
}
