import { http, unwrapApiResponse, type ApiEnvelope } from '@/shared/api/http' import type { MeasurementApprovalResponse, MeasurementReviewDetail, MeasurementReviewHistoryPage, MeasurementReviewHistoryPayload, MeasurementReviewRequest, } from './types' async function getData(path: string, params: Record) { const response = await http.get, ApiEnvelope>(path, { params }) return unwrapApiResponse(response) } function idempotencyKey() { if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') return crypto.randomUUID() return `review-${Date.now()}-${Math.random().toString(36).slice(2)}` } async function postReview(path: string, tenantId: string, body: unknown, key = idempotencyKey()) { const response = await http.post, ApiEnvelope>(path, body, { params: { tenantId }, headers: { 'Idempotency-Key': key }, }) return unwrapApiResponse(response) } function paginationNumber(value: number | string, fallback: number) { const parsed = Number(value) return Number.isFinite(parsed) && parsed >= 0 ? Math.trunc(parsed) : fallback } export function getMeasurementReviewDetail(tenantId: string, inboundId: string) { return getData( `/platform/v1/first-leg/inbounds/${inboundId}/measurement`, { tenantId }, ) } export async function listMeasurementReviewHistory( tenantId: string, inboundId: string, page = 1, size = 20, ) { const result = await getData( `/platform/v1/inbounds/${inboundId}/measurement-review-history`, { tenantId, page, size }, ) return { ...result, page: paginationNumber(result.page, page), size: paginationNumber(result.size, size), total: paginationNumber(result.total, 0), pages: paginationNumber(result.pages, 0), } satisfies MeasurementReviewHistoryPage } export function approveMeasurement( tenantId: string, inboundId: string, request: MeasurementReviewRequest, key?: string, ) { return postReview( `/platform/v1/inbounds/${inboundId}/measurements/approve`, tenantId, request, key, ) }