-- Migrasjon 011: invitasjonskode (oppdagelse) + cachet matchledelse (ADR-020).
--
-- To uavhengige, additive endringer:
--  1. tournament.join_code -- kort, menneske-skrivbar kode som løses til
--     riktig turnering FØR org-kontekst er kjent (samme "løs kontekst FØR
--     RLS kan håndheve noe"-problem som public_tournament_org, 007).
--     Bevisst OVERSTYRER visibility ved bruk (se ADR-020 Beslutning A) --
--     dette er ikke noe skjemaet håndhever, kun API-laget.
--  2. match.leading_side -- cachet fortegn av MatchState.lead (ADR-020
--     Beslutning C), samme mønster som status_text/points_side_a/b.

-- ---------------------------------------------------------------------
--  1. tournament.join_code
-- ---------------------------------------------------------------------

ALTER TABLE tournament ADD COLUMN join_code text;

-- Backfyll eksisterende rader (typisk 1-2 i prod på dette tidspunktet) med
-- en tilfeldig 6-tegns kode fra et alfabet uten forvekslingsbare tegn
-- (0/O, 1/I droppet). Kollisjonssjekk mot allerede-tildelte koder i samme
-- løkke -- radantallet er lite nok til at en enkel retry-løkke er trygg.
DO $$
DECLARE
    r RECORD;
    alphabet text := 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789';
    candidate text;
    attempt int;
    i int;
BEGIN
    FOR r IN SELECT id FROM tournament WHERE join_code IS NULL LOOP
        attempt := 0;
        LOOP
            candidate := '';
            FOR i IN 1..6 LOOP
                candidate := candidate || substr(alphabet, 1 + floor(random() * length(alphabet))::int, 1);
            END LOOP;
            attempt := attempt + 1;
            EXIT WHEN attempt > 20 OR NOT EXISTS (
                SELECT 1 FROM tournament WHERE join_code = candidate
            );
        END LOOP;
        UPDATE tournament SET join_code = candidate WHERE id = r.id;
    END LOOP;
END $$;

ALTER TABLE tournament ALTER COLUMN join_code SET NOT NULL;
ALTER TABLE tournament ADD CONSTRAINT tournament_join_code_unique UNIQUE (join_code);

-- ---------------------------------------------------------------------
--  2. match.leading_side
-- ---------------------------------------------------------------------

ALTER TABLE match ADD COLUMN leading_side text CHECK (leading_side IN ('a', 'b'));

-- ---------------------------------------------------------------------
--  3. public_tournament_by_code() -- fjerde SECURITY DEFINER-bro i
--     prosjektet (etter public_tournament_org 007, link_player_by_email 008,
--     public_org_by_slug 009), samme herding (SET search_path = public mot
--     kapring). Eksponerer KUN uuid<-text-koblingen, ingenting annet fra
--     tournament-raden. NULL for ukjent kode -- ingen egen anti-
--     enumereringsbekymring her siden koden er MENT å deles (se ADR-020
--     Beslutning A), men samme returform som de tre andre broene uansett.
-- ---------------------------------------------------------------------

CREATE FUNCTION public_tournament_by_code(p_code text)
RETURNS uuid
LANGUAGE sql
SECURITY DEFINER
SET search_path = public
STABLE
AS $$
    SELECT id FROM tournament WHERE upper(join_code) = upper(p_code);
$$;

GRANT EXECUTE ON FUNCTION public_tournament_by_code(text) TO teecup_app;
