import { useState } from 'react'
import { useNavigate } from 'react-router-dom'
import { formatINR } from '@sims/domain'
import { DataTable, EmptyState, ErrorState, Field, FilterChips, Skeleton, PageHeader } from '@sims/ui'
import { getDuesAging, getModuleRevenue, getProfitability, getAwsRanking } from '../api'
import { useData } from './Clients'
const inr = (p: number) => formatINR(p, { symbol: false })
const prevMonth = (): string => {
const d = new Date()
return new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth() - 1, 1)).toISOString().slice(0, 7)
}
/** Reports — dues aging, module revenue, client profitability, and the AWS cost chart (spec §5–§6). */
export function Reports() {
const nav = useNavigate()
const [month, setMonth] = useState(prevMonth())
const [report, setReport] = useState<'dues' | 'revenue' | 'profit' | 'aws'>('dues')
const dues = useData(getDuesAging, [])
const revenue = useData(() => getModuleRevenue(), [])
const profit = useData(() => getProfitability(), [])
const ranking = useData(() => getAwsRanking(month), [month])
return (
setReport(k as typeof report)}
chips={[
{ key: 'dues', label: 'Dues aging' },
{ key: 'revenue', label: 'Module revenue' },
{ key: 'profit', label: 'Profitability' },
{ key: 'aws', label: 'AWS costs' },
]}
/>
{report === 'dues' && (
dues.error !== undefined ?
: dues.data === undefined ?
: dues.data.length === 0 ? No outstanding dues.
: (
nav(`/clients/${dues.data![i]!.clientId}`)}
rowTone={(i) => ((dues.data![i]!.b90p > 0) ? 'err' : dues.data![i]!.b61_90 > 0 ? 'warn' : undefined)}
rows={dues.data.map((d) => ({
client: d.clientName, b1: inr(d.b0_30), b2: inr(d.b31_60), b3: inr(d.b61_90), b4: inr(d.b90p), total: inr(d.totalPaise),
}))}
/>
)
)}
{report === 'revenue' && (
revenue.error !== undefined ?
: revenue.data === undefined ?
: revenue.data.length === 0 ? No invoiced revenue yet.
: (
({ module: `${m.moduleName} (${m.moduleCode})`, billed: inr(m.billedPaise), settled: inr(m.settledPaise) }))}
/>
)
)}
{report === 'profit' && (
profit.error !== undefined ?
: profit.data === undefined ?
: profit.data.length === 0 ? No client activity yet.
: (
nav(`/clients/${profit.data![i]!.clientId}`)}
rows={profit.data.map((p) => ({
client: p.clientName, billed: inr(p.billedPaise), settled: inr(p.settledPaise),
aws: inr(p.awsCostPaise), margin: inr(p.marginPaise),
}))}
/>
)
)}
{report === 'aws' && (
<>
setMonth(e.target.value)} />
{ranking.error !== undefined ?
: ranking.data === undefined ?
: ranking.data.rows.length === 0 ? No AWS cost recorded for {month}.
: (
{ranking.data.rows.map((row) => (
nav(`/clients/${row.clientId}`)}>{row.clientName}
{inr(row.costPaise)}
{(row.sharePctBp / 100).toFixed(1)}%
))}
)}
>
)}
)
}