import type { FormatId } from "./types" export interface FormatDef { id: FormatId label: string description: string } export const FORMATS: FormatDef[] = [ { id: "slagspill", label: "Slagspill", description: "Vanlig individuell runde." }, { id: "stableford", label: "Stableford", description: "Poeng per hull i stedet for slag – kan plukke opp ved 0 poeng.", }, { id: "match", label: "Match", description: "To sider, hull mot hull." }, { id: "skins", label: "Skins", description: "Hvert hull er en egen premie – minst 3 spillere." }, { id: "fourball", label: "Fourball", description: "To mot to, beste ball per side." }, { id: "foursome", label: "Foursome", description: "To mot to, én delt ball, annenhver slår." }, { id: "greensome", label: "Greensome", description: "To mot to, begge slår ut, velger så én ball.", }, { id: "scramble2", label: "Scramble (2)", description: "To mot to, velger beste slag hver gang.", }, { id: "scramble4", label: "Scramble (4)", description: "Fire mot fire, velger beste slag hver gang.", }, { id: "chapman", label: "Chapman", description: "To mot to, bytter utslag, velger så én ball – som foursome fra andre slag.", }, { id: "copenhagen", label: "Københavner", description: "Nøyaktig 3 spillere – 6 poeng deles per hull etter rangering.", }, { id: "bbb", label: "Bingo Bango Bongo", description: "Poeng for først på green, nærmest hull, først i hull.", }, { id: "flag", label: "Flaggturnering", description: "Fast slagbudsjett (par + HCP) – flagget plantes der slagene tar slutt.", }, { id: "shamble", label: "Shamble", description: "2-4 spillere, alle slår ut, velger beste – spiller så egen ball inn.", }, { id: "moneyball", label: "Money Ball", description: "Fire spillere, én roterer som 'money ball' per hull.", }, { id: "highlowhigh", label: "High-low-high", description: "To lag à to – høy mot høy, lav mot lav, per hull.", }, { id: "scramblevssolo", label: "Scramble mot enkeltspiller", description: "Et lag med delt ball (minst 2 spillere) mot én enkeltspiller — nettoscore avgjør.", }, { id: "scramblevssolomatch", label: "Scramble mot enkeltspiller (matchspill)", description: "Samme oppsett som over, men avgjort hull for hull i stedet for netto totalsum.", }, ] export const FORMAT_MAP: Record = FORMATS.reduce( (acc, f) => { acc[f.id] = f return acc }, {} as Record, ) /** Two-sided team formats (drive the standard step-4 A/B layout). */ export const TWO_SIDED: FormatId[] = [ "match", "fourball", "foursome", "greensome", "scramble2", "scramble4", "chapman", "highlowhigh", ] export const SCRAMBLE_VS_SOLO: FormatId[] = ["scramblevssolo", "scramblevssolomatch"] // Samme sett som app/handicap.py sin SIDE_IS_UNIT (+ chapman-aliaset) -- // avgjør om HCP-prosenten bygges som "combined" (delt enhet) eller // "per_player" i allowance_override.strategy. export const SIDE_IS_UNIT_FORMAT: FormatId[] = ["foursome", "greensome", "scramble2", "scramble4", "chapman"] // "Bruk course handicap-justering" er skjult for disse to (ingen reell // nytteverdi), men holdes funksjonelt PÅ uansett -- se wizard-context.tsx. export const ORDINARY_FORMATS: FormatId[] = ["slagspill", "stableford"] export function isTwoSided(f: FormatId): boolean { return TWO_SIDED.includes(f) } export function isScrambleVsSolo(f: FormatId): boolean { return SCRAMBLE_VS_SOLO.includes(f) } /** Whether the Teams & order step (4) is shown for a given format. */ export function showsTeamStep(f: FormatId): boolean { return isTwoSided(f) || f === "moneyball" || isScrambleVsSolo(f) } // Wizardens FormatId -> ekte round.play_format-verdi (RoundCreate). export const FORMAT_TO_API: Record = { slagspill: "stroke", stableford: "stableford", match: "match", skins: "skins", fourball: "fourball", foursome: "foursome", greensome: "greensome", scramble2: "scramble_2", scramble4: "scramble_4", chapman: "chapman", copenhagen: "copenhagen", bbb: "bbb", flag: "flag", shamble: "shamble", moneyball: "money_ball", highlowhigh: "high_low_high", scramblevssolo: "scramble_solo", scramblevssolomatch: "scramble_solo_match", } export const API_TO_FORMAT: Record = Object.fromEntries( Object.entries(FORMAT_TO_API).map(([k, v]) => [v, k as FormatId]), ) as Record export function apiStatLevel(s: StatLevelLike): "strokes_only" | "strokes_and_putts" | "full" { return s === "score" ? "strokes_only" : s === "score_putts" ? "strokes_and_putts" : "full" } type StatLevelLike = "score" | "score_putts" | "full"