import type { TICCompanyResponse, TICCompanyDocument, TICBankAccount, TICSNICode, TICEmail, TICPhone, TICCompanyPurpose, TICFinancialReportSummary, } from './tic-types' import { TICAPIError } from './tic-types' const TIC_API_TIMEOUT = 15_000 /** * Generic TIC API fetch helper. * Routes through the proxy at TIC_API_PROXY_URL (no API key needed). */ export async function ticApiFetch(endpoint: string): Promise { const proxyUrl = process.env.TIC_API_PROXY_URL if (!proxyUrl) { throw new TICAPIError('TIC_API_PROXY_URL is not configured', undefined, 'NOT_CONFIGURED') } const url = `${proxyUrl}?endpoint=${encodeURIComponent(endpoint)}` try { const response = await fetch(url, { headers: { Accept: 'application/json' }, signal: AbortSignal.timeout(TIC_API_TIMEOUT), }) if (response.status === 404) { return null } if (response.status === 429) { throw new TICAPIError('Rate limit exceeded', 429, 'RATE_LIMIT_EXCEEDED') } if (!response.ok) { throw new TICAPIError(`TIC API error: ${response.statusText}`, response.status) } return await response.json() } catch (error: unknown) { if (error instanceof Error && (error.name === 'TimeoutError' || error.name === 'AbortError')) { throw new TICAPIError('Request timeout', undefined, 'TIMEOUT') } if (error instanceof TICAPIError) { throw error } const message = error instanceof Error ? error.message : String(error) throw new TICAPIError(`Failed to fetch from TIC: ${message}`) } } /** Search for a company by org number. Returns the first matching document or null. */ export async function searchCompanyByOrgNumber( orgNumber: string ): Promise { const cleaned = orgNumber.replace(/[\s-]/g, '') const data = await ticApiFetch( `/search/companies?q=${cleaned}&query_by=registrationNumber` ) if (!data || data.found === 0 || !data.hits?.[0]) { return null } return data.hits[0].document } /** Get bank accounts for a company. */ export async function getBankAccounts(companyId: number): Promise { return ticApiFetch(`/datasets/companies/${companyId}/bank-accounts`) } /** Get SNI codes for a company. */ export async function getSNICodes(companyId: number): Promise { return ticApiFetch(`/datasets/companies/${companyId}/se/sni`) } /** Get email addresses for a company. */ export async function getEmails(companyId: number): Promise { return ticApiFetch(`/datasets/companies/${companyId}/email-addresses`) } /** Get phone numbers for a company. */ export async function getPhones(companyId: number): Promise { return ticApiFetch(`/datasets/companies/${companyId}/phone-numbers`) } /** Get company purpose / verksamhetsbeskrivning. */ export async function getCompanyPurpose(companyId: number): Promise { return ticApiFetch(`/datasets/companies/${companyId}/purpose`) } /** Get financial report summaries for a company. */ export async function getFinancialReportSummaries(companyId: number): Promise { return ticApiFetch(`/datasets/companies/${companyId}/financial-report-summaries`) }