"use client"
// Aggregert statistikk på tvers av ALLE fullførte "Egne runder" (ADR-033),
// lenket fra dashbordets "Statistikk"-seksjon (2026-07-28). Egen backend-
// aggregering (GET /rounds/stats/summary) -- ikke bare klientside-utledning
// av round-stats.tsx sin logikk, siden putt/18-hull-regelen (padding av
// uspilte hull til 2 putter, KUN for dette tallet) må kjøre over ALLE
// fullførte runder samlet, ikke én runde om gangen.
import type React from "react"
import { useEffect, useState } from "react"
import { useRouter } from "next/navigation"
import Link from "next/link"
import { ArrowLeft, BarChart3, Flag, Target, Waves, Wind } from "lucide-react"
type ApiStatsSummary = {
rounds_completed: number
avg_score_to_par: number | null
avg_putts_per_18: number | null
putts_tracked_rounds: number
fairway_hit_pct: number | null
fairway_tracked_holes: number
gir_pct: number | null
gir_tracked_holes: number
one_putt_pct: number | null
scrambling_pct: number | null
sand_save_pct: number | null
avg_chip_per_round: number | null
avg_bunker_per_round: number | null
avg_penalty_per_round: number | null
avg_anyway_per_round: number | null
}
function signed(n: number): string {
const sign = n > 0 ? "+" : n < 0 ? "−" : "±"
return `${sign}${Math.abs(n).toFixed(1).replace(".", ",")}`
}
function pct(n: number): string {
return `${Math.round(n)} %`
}
function StatTile({ label, value, hint }: { label: string; value: string; hint?: string }) {
return (
{label}
{value}
{hint && {hint}}
)
}
function Section({
title,
icon: Icon,
children,
}: {
title: string
icon: typeof BarChart3
children: React.ReactNode
}) {
return (
)
}
export function RoundsStatsSummary() {
const router = useRouter()
const [data, setData] = useState(null)
const [error, setError] = useState(null)
useEffect(() => {
let cancelled = false
async function load() {
try {
const res = await fetch("/rounds/stats/summary", { credentials: "include" })
if (res.status === 401) {
router.replace("/")
return
}
if (!res.ok) throw new Error(`stats: ${res.status}`)
const json: ApiStatsSummary = await res.json()
if (!cancelled) setData(json)
} catch {
if (!cancelled) setError("Klarte ikke å hente statistikken. Prøv igjen om litt.")
}
}
void load()
return () => {
cancelled = true
}
}, [router])
return (
{error && (
{error}
)}
{data === null && !error ? (
) : data && data.rounds_completed === 0 ? (
Ingen fullførte runder ennå
Statistikken bygger seg opp automatisk etter hvert som du fullfører runder.
) : data ? (
<>
Aggregert over {data.rounds_completed} {data.rounds_completed === 1 ? "fullført runde" : "fullførte runder"}.
0
? `${data.putts_tracked_rounds} ${data.putts_tracked_rounds === 1 ? "runde med" : "runder med"} puttsporing`
: "Ingen runder med puttsporing ennå"
}
/>
0 ? `${data.fairway_tracked_holes} hull registrert` : undefined}
/>
0 ? `${data.gir_tracked_holes} hull registrert` : undefined}
/>
{data.avg_anyway_per_round !== null && (
)}
>
) : null}
)
}