-- =====================================================================
--  TeeCup — Flaggturnering: GPS-flaggplanting + runde 2+ (migrasjon 069,
--  frittstående runder). Se ARCHITECTURE_DECISIONS.md for ADR-tillegget.
--
--  To nye, uavhengige tabeller:
--
--  1. round_participant_flag_plant -- posisjonen der spilleren gikk tom
--     for slag. ETT aktivt flagg per deltaker (UNIQUE på round_
--     participant_id) -- re-planting er slett+opprett-på-nytt, samme
--     "aldri en delvis UPDATE"-prinsipp som round_shot (migrasjon 060).
--     `lap`/`hole_number` er hvilket hull/runde-nummer flagget faktisk
--     tilhører (beregnet server-side fra registrert scoredata, aldri
--     stolt blindt på fra klienten -- se app/routers/rounds.py).
--
--  2. round_hole_flag_overflow -- scoreføring for "runde 2+" (spilleren
--     fullførte 18 hull MED slag igjen, fortsetter play_order på nytt).
--     BEVISST en helt egen tabell, IKKE en lap-kolonne på selve
--     round_hole -- den tabellen er delt av samtlige ni eksisterende
--     spilleformater og lest av et stort antall eksisterende spørringer
--     (scorekort/statistikk/HCP-differensial) som alle antar ≤18 rader
--     per deltaker. En isolert tabell holder ALL risiko for denne
--     reelt sjeldne (krever uvanlig sjenerøst slagbudsjett) funksjonen
--     innenfor selve flagg-funksjonen, uten å røre noe annet format.
--
--  Eierskap/tilgang: samme non-RLS plain_connection() + app-lag-
--  autorisasjon som resten av frittstående-rundesystemet (ADR-033
--  Beslutning A) -- speiler round_shot presist.
-- =====================================================================
\set ON_ERROR_STOP on

CREATE TABLE round_participant_flag_plant (
    id                   uuid PRIMARY KEY DEFAULT gen_random_uuid(),
    round_participant_id uuid NOT NULL UNIQUE
        REFERENCES round_participant(id) ON DELETE CASCADE,
    lap                  smallint NOT NULL DEFAULT 1 CHECK (lap >= 1),
    hole_number          smallint NOT NULL CHECK (hole_number BETWEEN 1 AND 18),
    lat                  double precision NOT NULL CHECK (lat BETWEEN -90 AND 90),
    lng                  double precision NOT NULL CHECK (lng BETWEEN -180 AND 180),
    -- Landet flagget PÅ selve greenen -- avstand til hullet (cm-presisjon,
    -- meter+cm slås sammen til én cm-verdi her, splittes kun i UI-et)
    -- brukes til å rangere spillere som gikk tom på SAMME hull mot
    -- hverandre (jo nærmere koppen, jo lengre har spilleren kommet).
    on_green             boolean NOT NULL DEFAULT false,
    distance_to_pin_cm   integer CHECK (distance_to_pin_cm >= 0),
    CHECK (on_green OR distance_to_pin_cm IS NULL),
    planted_by_user_id   uuid NOT NULL REFERENCES app_user(id),
    planted_at           timestamptz NOT NULL DEFAULT now()
);

CREATE TABLE round_hole_flag_overflow (
    id                   uuid PRIMARY KEY DEFAULT gen_random_uuid(),
    round_participant_id uuid NOT NULL
        REFERENCES round_participant(id) ON DELETE CASCADE,
    lap                  smallint NOT NULL CHECK (lap >= 2),
    hole_number          smallint NOT NULL CHECK (hole_number BETWEEN 1 AND 18),
    score                smallint CHECK (score > 0),
    played               boolean NOT NULL DEFAULT false,
    UNIQUE (round_participant_id, lap, hole_number)
);

CREATE INDEX round_hole_flag_overflow_participant_idx
    ON round_hole_flag_overflow (round_participant_id);

-- INGEN RLS -- samme plain_connection()-mønster som round_shot/round_hole.
GRANT SELECT, INSERT, DELETE ON round_participant_flag_plant TO teecup_app;
GRANT SELECT, INSERT, UPDATE, DELETE ON round_hole_flag_overflow TO teecup_app;
