import type { Company, Invoice, CreateInvoiceRequest, ApiConfig, } from "../types/index.js"; function getApiConfig(): ApiConfig { return { baseUrl: process.env.API_BASE_URL || "http://localhost:8007/api/v1", timeout: parseInt(process.env.API_TIMEOUT || "30000", 10), }; } async function apiRequest( endpoint: string, options: RequestInit = {} ): Promise { const config = getApiConfig(); const url = `${config.baseUrl}${endpoint}`; const controller = new AbortController(); const timeout = setTimeout(() => controller.abort(), config.timeout); try { const response = await fetch(url, { ...options, signal: controller.signal, headers: { "Content-Type": "application/json", ...options.headers, }, }); if (!response.ok) { const error = await response.json().catch(() => ({})); throw new Error( (error as { detail?: string }).detail || `API error: ${response.status} ${response.statusText}` ); } return response.json() as Promise; } finally { clearTimeout(timeout); } } export async function listCompanies(): Promise { return apiRequest("/companies"); } export async function getCompany(id: string): Promise { return apiRequest(`/companies/${id}`); } export async function createCompany( company: Omit ): Promise { return apiRequest("/companies", { method: "POST", body: JSON.stringify(company), }); } export async function updateCompany( id: string, company: Partial ): Promise { return apiRequest(`/companies/${id}`, { method: "PUT", body: JSON.stringify(company), }); } export async function deleteCompany(id: string): Promise { await apiRequest(`/companies/${id}`, { method: "DELETE", }); } export async function listInvoices(): Promise { return apiRequest("/invoices"); } export async function getInvoice(id: string): Promise { return apiRequest(`/invoices/${id}`); } export async function createInvoice( request: CreateInvoiceRequest ): Promise { return apiRequest("/invoices", { method: "POST", body: JSON.stringify(request), }); } export async function downloadInvoicePdf( id: string, outputPath: string ): Promise { const config = getApiConfig(); const url = `${config.baseUrl}/invoices/${id}/pdf`; const response = await fetch(url); if (!response.ok) { throw new Error(`Failed to download PDF: ${response.statusText}`); } const buffer = await response.arrayBuffer(); const fs = require("fs"); fs.writeFileSync(outputPath, Buffer.from(buffer)); } export async function checkApiHealth(): Promise { try { const config = getApiConfig(); const response = await fetch(`${config.baseUrl.replace("/api/v1", "")}/health`); return response.ok; } catch { return false; } }