import type { AcceptServiceApplicationRequest, AcceptServiceApplicationResponse, AssigneeOption, BeneficiaryDetailResponse, BeneficiaryTagOption, ConfirmUploadResponse, CompleteServiceCaseRequest, CompleteServiceCaseResponse, CreateServiceRecordRequest, CreateUploadIntentRequest, CreateUploadIntentResponse, DownloadUrlResponse, PaginatedBeneficiariesResponse, PaginatedServiceCasesResponse, ReplaceCaseAssigneesRequest, ServiceCaseDetailResponse, ServiceCategory, ServiceCaseStatus, ServiceRecordResponse, TransitionServiceApplicationRequest, UpdateBeneficiaryRequest, UpdateServiceRecordRequest, } from '@lehuo/contracts'; import { apiRequest } from './api-client'; function queryString(values: Record): string { const params = new URLSearchParams(); Object.entries(values).forEach(([key, value]) => { if (value !== undefined && value !== '') params.set(key, String(value)); }); return params.toString(); } export function transitionServiceApplication( publicId: string, input: TransitionServiceApplicationRequest, ): Promise<{ status: string }> { return apiRequest( `/api/v1/admin/service-applications/${encodeURIComponent(publicId)}/transition`, { method: 'POST', body: JSON.stringify(input), }, ); } export function acceptServiceApplication( publicId: string, input: AcceptServiceApplicationRequest, ): Promise { return apiRequest(`/api/v1/admin/service-applications/${encodeURIComponent(publicId)}/accept`, { method: 'POST', body: JSON.stringify(input), }); } export function fetchBeneficiaryTags(): Promise { return apiRequest('/api/v1/admin/beneficiaries/tags'); } export function fetchBeneficiaries(query: { page: number; pageSize: number; primaryCategory?: ServiceCategory; status?: string; keyCareFlag?: boolean; }): Promise { return apiRequest(`/api/v1/admin/beneficiaries?${queryString(query)}`); } export function fetchBeneficiary(publicId: string): Promise { return apiRequest(`/api/v1/admin/beneficiaries/${encodeURIComponent(publicId)}`); } export function updateBeneficiary( publicId: string, input: UpdateBeneficiaryRequest, ): Promise { return apiRequest(`/api/v1/admin/beneficiaries/${encodeURIComponent(publicId)}`, { method: 'PUT', body: JSON.stringify(input), }); } export function fetchAssigneeOptions(): Promise { return apiRequest('/api/v1/admin/service-cases/assignee-options'); } export function fetchServiceCases(query: { page: number; pageSize: number; status?: ServiceCaseStatus; category?: ServiceCategory; caseNo?: string; }): Promise { return apiRequest(`/api/v1/admin/service-cases?${queryString(query)}`); } export function fetchServiceCase(publicId: string): Promise { return apiRequest(`/api/v1/admin/service-cases/${encodeURIComponent(publicId)}`); } export function startServiceCase(publicId: string): Promise { return apiRequest(`/api/v1/admin/service-cases/${encodeURIComponent(publicId)}/start`, { method: 'POST', body: '{}', }); } export function completeServiceCase( publicId: string, input: CompleteServiceCaseRequest, ): Promise { return apiRequest(`/api/v1/admin/service-cases/${encodeURIComponent(publicId)}/complete`, { method: 'POST', body: JSON.stringify(input), }); } export function replaceCaseAssignees( publicId: string, input: ReplaceCaseAssigneesRequest, ): Promise { return apiRequest(`/api/v1/admin/service-cases/${encodeURIComponent(publicId)}/assignees`, { method: 'PUT', body: JSON.stringify(input), }); } export function createServiceRecord( publicId: string, input: CreateServiceRecordRequest, ): Promise { return apiRequest(`/api/v1/admin/service-cases/${encodeURIComponent(publicId)}/records`, { method: 'POST', body: JSON.stringify(input), }); } export function updateServiceRecord( casePublicId: string, recordPublicId: string, input: UpdateServiceRecordRequest, ): Promise { return apiRequest( `/api/v1/admin/service-cases/${encodeURIComponent(casePublicId)}/records/${encodeURIComponent(recordPublicId)}`, { method: 'PATCH', body: JSON.stringify(input) }, ); } export function createUploadIntent( casePublicId: string, input: CreateUploadIntentRequest, ): Promise { return apiRequest( `/api/v1/service-cases/${encodeURIComponent(casePublicId)}/files/upload-intents`, { method: 'POST', body: JSON.stringify(input) }, ); } export function confirmUpload(publicId: string): Promise { return apiRequest(`/api/v1/files/${encodeURIComponent(publicId)}/confirm`, { method: 'POST', body: '{}', }); } export function fetchDownloadUrl(publicId: string): Promise { return apiRequest(`/api/v1/files/${encodeURIComponent(publicId)}/download-url`); }