-- =====================================================================
--  TeeCup — kjønn hører til RATINGEN, ikke selve utslaget  (migrasjon 014)
-- =====================================================================
--  Reist av brukeren 2026-07-19: en golfbane har IKKE fysisk kjønnsdelte
--  utslag -- begge kjønn kan som regel spille fra ethvert utslag. Det
--  eneste som faktisk varierer per kjønn er om klubben har VALGT å slope
--  (rate) et gitt utslag for det respektive kjønnet (noen klubber sloper
--  bevisst ikke det lengste utslaget for damer). `tee.gender` (migrasjon
--  001) konflaterte feilaktig utslaget og ratingen -- hvert fysisk utslag
--  ble lagret som TO separate `tee`-rader (én per kjønn), bekreftet mot
--  ekte importert Tjøme-data (fire utslag, hver som et rent m/f-par).
--
--  Denne migrasjonen flytter `gender` fra `tee` til `tee_rating` (der det
--  faktisk hører hjemme -- én fysisk tee kan ha 0, 1 eller 2
--  kjønnsspesifikke ratinger), og slår sammen eksisterende kjønns-par-rader
--  til én fysisk tee-rad. Se ARCHITECTURE_DECISIONS.md ADR-029.
--
--  Kjørt trygt mot ekte data FORDI (bekreftet FØR skriving, read-only):
--  alle eksisterende tee-rader er rene navnepar (m+f, ingen 'x'), ingen
--  gruppe har mer enn to rader.
-- =====================================================================

\set ON_ERROR_STOP on

BEGIN;

ALTER TABLE tee_rating ADD COLUMN gender text;

-- Fyll inn gender på HVER eksisterende tee_rating-rad fra sin (ennå
-- urørte) eier-tee, FØR noe slås sammen eller slettes.
UPDATE tee_rating tr
SET gender = t.gender
FROM tee t
WHERE t.id = tr.tee_id;

-- Selve golfregelen: en WHS-rating er alltid for ett bestemt kjønn -- 'x'
-- (som var gyldig på PLAYER-nivå) gir ikke mening for en rating. Krasjer
-- høyt her (NOT NULL + CHECK) hvis noen ukjent/uventet rad skulle mangle
-- et gyldig kjønn -- fanger det FØR det stille blir en umulig rating,
-- ikke etterpå.
ALTER TABLE tee_rating ALTER COLUMN gender SET NOT NULL;
ALTER TABLE tee_rating ADD CONSTRAINT tee_rating_gender_check CHECK (gender IN ('m', 'f'));

-- Den GAMLE unikheten (tee_id, scope) må vekk FØR sammenslåingen under --
-- å flytte en "duplikat"-tee sin rating over til beholder-tee-en kolliderer
-- ellers midlertidig med beholderens EGEN eksisterende (tee_id, scope)-rad
-- (samme scope, men snart ulikt kjønn -- det er jo poenget). Den NYE,
-- kjønnsbevisste unikheten legges til ETTER sammenslåingen, når den faktisk
-- kan håndheves riktig.
ALTER TABLE tee_rating DROP CONSTRAINT tee_rating_tee_id_scope_key;

-- Slå sammen "duplikat"-utslag (samme bane+navn, hittil ulikt kjønn på
-- selve tee-raden) til ÉN fysisk tee-rad. Velger MIN(id) per
-- (course_id, name) som "beholderen".
CREATE TEMP TABLE tee_merge_map AS
SELECT t.id AS old_id,
       (SELECT min(t2.id::text)::uuid FROM tee t2
        WHERE t2.course_id = t.course_id AND t2.name = t.name) AS keeper_id
FROM tee t;

UPDATE tee_rating tr
SET tee_id = m.keeper_id
FROM tee_merge_map m
WHERE tr.tee_id = m.old_id AND m.old_id <> m.keeper_id;

UPDATE match_participant mp
SET tee_id = m.keeper_id
FROM tee_merge_map m
WHERE mp.tee_id = m.old_id AND m.old_id <> m.keeper_id;

DELETE FROM tee t
USING tee_merge_map m
WHERE t.id = m.old_id AND m.old_id <> m.keeper_id;

DROP TABLE tee_merge_map;

-- Unikhet er nå per (tee_id, scope, gender) -- ett utslag kan ha BÅDE en
-- herre- og en dame-rating for samme scope.
ALTER TABLE tee_rating ADD CONSTRAINT tee_rating_tee_id_scope_gender_key UNIQUE (tee_id, scope, gender);

ALTER TABLE tee DROP CONSTRAINT tee_gender_check;
ALTER TABLE tee DROP COLUMN gender;

COMMIT;
