"use client"
// MIDLERTIDIG hånd-kodet hull-diagram (ADR-083, 2026-08-17) -- bygget for
// å bevise geometrikjeden (frontend/lib/hole-geometry.ts) fungerer riktig
// ende-til-ende FØR en V0-prompt skrives, samme rekkefølge som
// FlagPlantSheet/PlayerImportPanel tidligere denne økten. Erstattes med en
// V0-eksportert visning senere -- selve geometri-utregningen (i
// hole-target-distance.tsx) endres ikke ved bytte, kun denne rene
// visningen.
//
// Tee vises alltid nederst, green (senter) alltid øverst -- fast akse
// (IKKE spillerens gangretning), se hole-target-distance.tsx sin
// teeRef-uthenting. alongPercent/crossMeters kommer ferdigregnet inn,
// klippes KUN her (ved selve tegningen), ikke i dataen.
import { Flag, MapPin } from "lucide-react"
import { cn } from "@/lib/utils"
type DiagramHazard = {
label: string
distanceMeters: number
alongPercent: number
crossMeters: number
}
export function HoleDiagram({
distances,
playerPosition,
hazards,
size = "full",
className,
}: {
distances: { front: number; middle: number; back: number }
playerPosition: { alongPercent: number; crossMeters: number }
hazards: DiagramHazard[]
size?: "compact" | "full"
className?: string
}) {
// Diagrammet trenger plass -- kompakt-visningen (badge ved GIR-merket)
// viser fortsatt kun tallene + full hindringsliste, ikke selve tegningen.
if (size === "compact") {
return (
)
}
return (
{hazards.length > 0 && (
)}
)
}
const LANE_HEIGHT_PX = 260
// Faktisk fairway-bredde er ikke kjent fra dataen -- klipper visuelt til
// ±30 m fra midtlinjen, en fornuftig typisk verdi (se ADR-083). Selve
// TALLENE (distanceMeters) er alltid nøyaktige uansett -- kun selve
// PLASSERINGEN i tegningen klippes.
const MAX_CROSS_METERS = 30
function clampAlong(percent: number): number {
return Math.min(100, Math.max(0, percent))
}
function crossToOffsetPercent(crossMeters: number): number {
const clamped = Math.min(MAX_CROSS_METERS, Math.max(-MAX_CROSS_METERS, crossMeters))
return (clamped / MAX_CROSS_METERS) * 42 // maks ±42% fra senter, litt luft i kantene
}
function Lane({
playerPosition,
hazards,
}: {
playerPosition: { alongPercent: number; crossMeters: number }
hazards: DiagramHazard[]
}) {
return (
{/* Midtlinje -- ren visuell referanse, ikke en ekte fairway-kant. */}
{/* Green -- fast øverst. */}
Green
{/* Tee -- fast nederst. */}
Tee
{/* Hindringer, plassert langs+til side av aksen. */}
{hazards.map((h, i) => (
{h.distanceMeters}m
))}
{/* Spilleren -- "du er her". */}
)
}
function NumberColumn({
label,
value,
emphasized,
}: {
label: string
value: number
emphasized?: boolean
}) {
return (
{label}
{value}
m
)
}
function HazardTextList({ hazards, compact }: { hazards: DiagramHazard[]; compact?: boolean }) {
if (hazards.length === 0) return null
return (
{hazards.map((h, i) => (
-
{h.label}: {h.distanceMeters} m
))}
)
}