"use client"; import { useEffect, useMemo, useState, type FormEvent } from "react"; import { Play } from "lucide-react"; import clsx from "clsx"; import { api, type Fact, type FundamentalsOut, type PeriodsOut } from "@/lib/api"; import { useQueryParam } from "@/lib/hooks"; import { fmtCompact, fmtInt, fmtNum, fmtTs, nowLocalInput } from "@/lib/format"; import { Banner, Card, Empty, ErrorState, Field, PageHeader, StatusBadge, Tabs } from "@/components/ui"; import { DataTable } from "@/components/DataTable"; const DEFAULT_PIVOT = 6; export default function FundamentalsPage() { const qTicker = useQueryParam("ticker"); const [ticker, setTicker] = useState("AAPL"); const [asOf, setAsOf] = useState(nowLocalInput()); const [periodType, setPeriodType] = useState<"" | "q" | "a">("q"); const [metrics, setMetrics] = useState(""); const [out, setOut] = useState(null); const [periods, setPeriods] = useState(null); const [busy, setBusy] = useState(false); const [error, setError] = useState(null); const [tab, setTab] = useState<"pivot" | "facts" | "periods" | "earnings">("pivot"); const [pivotMetrics, setPivotMetrics] = useState([]); useEffect(() => { if (qTicker) setTicker(qTicker.toUpperCase()); }, [qTicker]); async function run(e?: FormEvent) { e?.preventDefault(); setBusy(true); setError(null); try { const asOfIso = asOf ? new Date(asOf).toISOString() : undefined; const t = ticker.trim(); const [f, p] = await Promise.all([ api.get(`/fundamentals/${encodeURIComponent(t)}`, { as_of: asOfIso, metrics: metrics.trim() || undefined, period_type: periodType || undefined, limit: 5000 }), api.get(`/fundamentals/${encodeURIComponent(t)}/periods`).catch(() => null), ]); setOut(f); setPeriods(p); const all = Array.from(new Set(f.data.map((x) => x.metric))); setPivotMetrics((cur) => (cur.length ? cur.filter((m) => all.includes(m)) : all.slice(0, DEFAULT_PIVOT))); } catch (err) { setError(err instanceof Error ? err : new Error(String(err))); setOut(null); setPeriods(null); } finally { setBusy(false); } } const allMetrics = useMemo(() => Array.from(new Set((out?.data ?? []).map((x) => x.metric))).sort(), [out]); const pivot = useMemo(() => { const rows = new Map }>(); for (const f of out?.data ?? []) { const key = `${f.fiscal_period_end}|${f.fiscal_period_type}`; const r = rows.get(key) ?? { period: f.fiscal_period_end, type: f.fiscal_period_type, fy: f.fiscal_year, fp: f.fiscal_period, filing: f.filing_date, values: {} }; r.values[f.metric] = f; rows.set(key, r); } return Array.from(rows.values()).sort((a, b) => b.period.localeCompare(a.period)); }, [out]); return ( <>
setTicker(e.target.value)} required placeholder="AAPL or frd:AAPL" /> setAsOf(e.target.value)} /> setMetrics(e.target.value)} placeholder="rev, net_inc, eps" />
{error && void run()} />} {out && ( <>
{fmtInt(out.meta.rows)} facts as of {fmtTs(out.meta.as_of)} {out.meta.facts_hidden_by_as_of > 0 && {fmtInt(out.meta.facts_hidden_by_as_of)} facts hidden by as_of} {out.entity && {String(out.entity.name ?? out.entity.entity_id ?? "")}}
PIT policy: {out.meta.pit_policy}. Revision history exists only from the first ingestion by this platform. {tab === "pivot" && ( {pivotMetrics.length} of {allMetrics.length} metrics}>
{allMetrics.map((m) => { const on = pivotMetrics.includes(m); return ( ); })}
{pivot.length === 0 ? ( No facts visible at this as-of instant. ) : (
{pivotMetrics.map((m) => ( ))} {pivot.map((r) => ( {pivotMetrics.map((m) => { const f = r.values[m]; return ( ); })} ))}
Period end FY / FP Filed {m}
{r.period} {r.type} {r.fy ?? "—"} / {r.fp ?? "—"} {r.filing ?? "—"} {f ? ( <> {fmtValue(f)} {f.revision_id > 1 && r{f.revision_id}} ) : ( — )}
)}

Values compacted (K/M/B); hover for exact value and unit. rN marks a revision observed before as-of.

)} {tab === "facts" && ( `${f.metric}-${f.fiscal_period_end}-${f.fiscal_period_type}-${f.revision_id}-${i}`} mobile="scroll" maxHeight="60dvh" columns={[ { key: "metric", header: "Metric", mono: true }, { key: "value", header: "Value", num: true, render: (f) => {fmtValue(f)} }, { key: "unit", header: "Unit", hideSm: true }, { key: "fiscal_period_end", header: "Period end", render: (f) => {f.fiscal_period_end} {f.fiscal_period_type} }, { key: "fy", header: "FY/FP", hideSm: true, render: (f) => `${f.fiscal_year ?? "—"}/${f.fiscal_period ?? "—"}` }, { key: "filing_date", header: "Filed", render: (f) => {f.filing_date ?? "—"} }, { key: "available_at", header: "Available at", hideSm: true, render: (f) => {fmtTs(f.available_at)} }, { key: "observed_at", header: "Observed at", hideSm: true, render: (f) => {fmtTs(f.observed_at)} }, { key: "revision_id", header: "Rev", num: true }, { key: "restatement_flag", header: "Restated", render: (f) => (f.restatement_flag ? : no) }, { key: "source_document", header: "Source", hideSm: true, render: (f) => {f.source_document ?? f.source_id} }, ]} /> )} {tab === "periods" && ( `${p.fiscal_period_end}-${p.fiscal_period_type}-${p.filing_date}`} mobile="scroll" maxHeight="60dvh" columns={[ { key: "fiscal_period_end", header: "Period end", render: (p) => {p.fiscal_period_end} {p.fiscal_period_type} }, { key: "fy", header: "FY/FP", render: (p) => `${p.fiscal_year ?? "—"}/${p.fiscal_period ?? "—"}` }, { key: "filing_date", header: "Filed", render: (p) => {p.filing_date ?? "—"} }, { key: "available_at", header: "Available at", render: (p) => {fmtTs(p.available_at)} }, { key: "metrics", header: "Metrics", num: true, render: (p) => fmtInt(p.metrics) }, { key: "max_revision", header: "Max rev", num: true }, { key: "restated", header: "Restated", render: (p) => (p.restated ? : no) }, ]} empty="No periods." /> )} {tab === "earnings" && ( e.event_date} mobile="scroll" maxHeight="60dvh" columns={[ { key: "event_date", header: "Date", render: (e) => {e.event_date} }, { key: "release_time", header: "Release", render: (e) => e.release_time ?? "—" }, { key: "eps_estimate", header: "EPS est.", num: true, render: (e) => fmtNum(e.eps_estimate, 2) }, { key: "eps_reported", header: "EPS rep.", num: true, render: (e) => fmtNum(e.eps_reported, 2) }, { key: "surprise", header: "Surprise", num: true, render: (e) => (e.eps_estimate !== null && e.eps_reported !== null ? fmtNum(e.eps_reported - e.eps_estimate, 2) : "—") }, ]} empty="No earnings events." /> )} )} ); } function fmtValue(f: Fact): string { if (f.value === null || f.value === undefined) return "—"; const u = (f.unit ?? "").toLowerCase(); if (u.includes("ratio") || u.includes("per_share") || u === "pct" || u === "percent" || Math.abs(f.value) < 1000) return fmtNum(f.value, 2); return fmtCompact(f.value); }