import type { ApiCourseHole, ApiCourseTee } from "@/components/course-template-editor"

export type ApiGender = "m" | "f"
export type Gender = "mann" | "kvinne" | "annet"

export type StatLevel = "score" | "score_putts" | "full"

/** Banens utslag -- ekte API-et eksponerer KUN hvilke(t) kjønn utslaget har
 * rating for (`genders`), ikke selve CR/Slope-tallene til klienten (de
 * brukes kun server-side til handicap-beregning). */
export interface Tee {
  id: string
  name: string
  genders: ApiGender[]
}

export interface Course {
  id: string
  name: string
  tees: Tee[]
  /** Fullt hull-/utslagoppsett for "bruk som mal"-broen -- fraværende/tom
   * når kilden (teeoff) ikke har komplette nok data til å brukes som mal. */
  templateHoles?: ApiCourseHole[]
  templateTees?: ApiCourseTee[]
}

export interface Facility {
  slug: string
  name: string
  city: string | null
  county: string | null
}

/** Hvilken bane-kilde+id som faktisk skal sendes til /rounds. */
export type CourseMeta =
  | { source: "teeoff"; facilitySlug: string; teeoffCourseId: number }
  | { source: "custom"; personalCourseId: string }

/** En bane funnet i et offisielt anlegg (fra /rounds/official-search/{slug}). */
export interface OfficialCourseOption {
  teeoffCourseId: number
  course: Course
}

/** En konto som kan søkes opp og lenkes inn i runden. */
export interface Account {
  id: string
  firstName: string
  lastName: string
  handicap: number | null
}

/** En gjest brukeren har registrert før (scoped til denne brukeren). */
export interface KnownGuest {
  firstName: string
  lastName: string
  gender: ApiGender | null
  hcp: number | null
}

export type PlayerKind = "owner" | "account" | "guest"

export interface Player {
  key: string // stabil lokal nøkkel
  kind: PlayerKind
  accountId?: string
  firstName: string
  lastName: string
  gender?: Gender // kjent for eier/gjest; ukjent for nettopp lenkede kontoer
  isGuest: boolean
  email?: string
  hcp?: number | null // gjest/eier numerisk; null når ukjent
  hcpFromProfile?: boolean
  teeId?: string
  statLevel: StatLevel
  /** "A" | "B" for to-sidede formater, "team" | "solo" for scramble-mot-solo. */
  sideId?: string
  moneyBallSlot?: number
}

export type FormatId =
  | "slagspill"
  | "stableford"
  | "match"
  | "skins"
  | "fourball"
  | "foursome"
  | "greensome"
  | "scramble2"
  | "scramble4"
  | "chapman"
  | "copenhagen"
  | "bbb"
  | "flag"
  | "shamble"
  | "moneyball"
  | "highlowhigh"
  | "scramblevssolo"
  | "scramblevssolomatch"

export type Visibility = "private" | "friends" | "public"

export type Sub1 =
  | "source"
  | "official-search"
  | "official-courses"
  | "own-search"
  | "international-search"
  | "own-create"
  | "template-source"
  | "fields"
