import { useQuery } from '@tanstack/react-query'; import { api } from '../lib/api'; import type { ApiResponse, PaginatedResponse } from '../lib/api'; /** A derived per-patient payment status shown on the list (node 1). */ export type PaymentRowStatus = 'paid' | 'unpaid' | 'unsettled'; export interface PatientPaymentRow { patient_uuid: string; patient_name: string | null; national_code: string | null; invoice_count: number; paid_rials: number; remaining_rials: number; status: PaymentRowStatus; } export interface PatientPaymentFilters { page: number; national_code?: string; status?: string; // paid | unsettled | unpaid from?: number; // unix seconds to?: number; // unix seconds } /** A single invoice status on the detail table (node 2) — two-state. */ export type InvoiceRowStatus = 'paid' | 'unsettled'; export interface PatientInvoiceRow { uuid: string; number: number; issued_at: number; total_rials: number; status: InvoiceRowStatus; service_title: string | null; items: Array<{ uuid: string; title: string; quantity: number; total_rials: number; patient_rials: number }>; } export interface PatientInvoicesPayload { patient: { uuid: string; name: string | null; national_code: string | null }; data: PatientInvoiceRow[]; meta: { totalRecords: number; totalPages: number; currentPage: number }; } const LIMIT = 20; /** Node 1 — paginated per-patient payment summary for the current tenant. */ export function usePatientPayments(filters: PatientPaymentFilters) { const qs = new URLSearchParams({ page: String(filters.page), limit: String(LIMIT) }); if (filters.national_code) qs.set('national_code', filters.national_code); if (filters.status) qs.set('status', filters.status); if (filters.from) qs.set('from', String(filters.from)); if (filters.to) qs.set('to', String(filters.to)); return useQuery>({ queryKey: ['patient-payments', filters], queryFn: () => api.get(`/api/v1/my/billing/patient-payments?${qs.toString()}`), }); } /** Node 2 — a single patient's recorded invoices (header + paginated list). */ export function usePatientInvoices(patientUuid: string | undefined, page: number) { return useQuery>({ queryKey: ['patient-invoices', patientUuid, page], queryFn: () => api.get(`/api/v1/my/billing/patients/${patientUuid}/invoices?page=${page}&limit=${LIMIT}`), enabled: !!patientUuid, }); } export const MY_PAYMENTS_LIMIT = LIMIT;