# SMB3.fi — Migraatio-ohje (vanha → uusi)

Tämä ohje kertoo kuinka siirtää data vanhasta `/kisat/`-järjestelmästä
uuteen `smb3fi`-skeemaan.

## Ennen kuin aloitat

```bash
# Ota AINA varmuuskopio ensin
mysqldump smbfi_sm25 > backup_vanha_$(date +%Y%m%d_%H%M).sql
mysqldump smb3fi     > backup_uusi_$(date +%Y%m%d_%H%M).sql
```

---

## Vaihe 1 — Käyttäjät

Vanha skeema (`smbfi_sm25.users`) → uusi skeema (`smb3fi.users`).

```sql
-- Aja uudessa tietokannassa (smb3fi)

-- 1a. Siirrä käyttäjät (status-mappaus: is_approved 1 → active, 0 → pending)
INSERT INTO smb3fi.users
    (id, username, password_hash, display_name, status, created_at)
SELECT
    id,
    username,
    password       AS password_hash,
    username       AS display_name,
    CASE WHEN is_approved = 1 THEN 'active' ELSE 'pending' END AS status,
    created_at
FROM smbfi_sm25.users
ON DUPLICATE KEY UPDATE username = VALUES(username);

-- 1b. Roolit — mappaa vanhat roolinimet uusiin
-- Vanhassa: roles-taulu tai user_roles. Tarkista ensin vanhan rakenne:
-- SELECT * FROM smbfi_sm25.user_roles LIMIT 5;

-- Esimerkki: jos vanhassa oli slug 'host' ja 'admin' -roolit:
INSERT IGNORE INTO smb3fi.user_roles (user_id, role_id)
SELECT
    ur.user_id,
    (SELECT id FROM smb3fi.roles WHERE slug = r.slug)
FROM smbfi_sm25.user_roles ur
INNER JOIN smbfi_sm25.roles r ON r.id = ur.role_id
WHERE r.slug IN ('admin','host','commentator','referee','player')
  AND EXISTS (SELECT 1 FROM smb3fi.users WHERE id = ur.user_id);
```

---

## Vaihe 2 — Turnaus

Uudessa järjestelmässä yksi turnaus = yksi rivi `tournaments`-taulussa.
Luo turnaus ensin joko hallintapaneelista tai SQL:llä:

```sql
INSERT INTO smb3fi.tournaments
    (slug, name, game, season, format, status, group_count,
     players_per_group, advance_per_group, start_date, created_by)
VALUES
    ('sm-kisat-2025', 'SMB3 SM-kisat 2025', 'Super Mario Bros. 3',
     '2025', 'group_single', 'finished', 2, 4, 2, '2025-09-01',
     (SELECT id FROM smb3fi.users WHERE username = 'admin'));

SET @new_tid := LAST_INSERT_ID();

-- Vaiheet
INSERT INTO smb3fi.tournament_phases
    (tournament_id, name, phase_type, position, match_format, seeding_method)
VALUES
    (@new_tid, 'Lohkovaihe', 'group', 1, 'points_only', 'elo'),
    (@new_tid, 'Välierät',   'bracket', 2, 'bo1', 'cross'),
    (@new_tid, 'Finaali',    'bracket', 3, 'bo3', 'cross');

SET @phase_group := (SELECT id FROM smb3fi.tournament_phases
                     WHERE tournament_id = @new_tid AND phase_type = 'group');

-- Lohkot (muuta nämä vastaamaan vanhaa rakennettasi)
INSERT INTO smb3fi.tournament_groups (tournament_id, phase_id, name, position)
VALUES
    (@new_tid, @phase_group, 'A', 0),
    (@new_tid, @phase_group, 'B', 1);
```

---

## Vaihe 3 — Ottelut

Vanhan skeeman `matches`-taulu → uusi `smb3fi.matches`.

```sql
-- Hae vanhan skeeman kentät ensin:
-- DESCRIBE smbfi_sm25.matches;

-- Pelatut ottelut (is_played = 1):
INSERT INTO smb3fi.matches (
    tournament_id, phase_id, group_id,
    player1_id, player2_id, host_id,
    match_format, scheduled_at, played_at,
    p1_score, p2_score,
    winner_id, status, vod_url, created_by
)
SELECT
    @new_tid                         AS tournament_id,
    @phase_group                     AS phase_id,
    -- Mappaa lohko: tässä esimerkki jos vanha group_name = 'A' tai 'B'
    (SELECT tg.id FROM smb3fi.tournament_groups tg
     WHERE tg.tournament_id = @new_tid AND tg.name = old.group_name
     LIMIT 1)                        AS group_id,

    -- player1: vanhassa voi olla string (username) tai int (id)
    -- Jos string: (SELECT id FROM smb3fi.users WHERE username = old.player1)
    (SELECT id FROM smb3fi.users WHERE username = old.player1 LIMIT 1) AS player1_id,
    (SELECT id FROM smb3fi.users WHERE username = old.player2 LIMIT 1) AS player2_id,
    (SELECT id FROM smb3fi.users WHERE username = (
        SELECT username FROM smbfi_sm25.users WHERE id = old.host_id
    ) LIMIT 1)                       AS host_id,

    'points_only'                    AS match_format,
    CONCAT(old.match_date, ' ', old.match_time) AS scheduled_at,
    CONCAT(old.match_date, ' ', old.match_time) AS played_at,
    COALESCE(old.player1_score, 0)   AS p1_score,
    COALESCE(old.player2_score, 0)   AS p2_score,
    CASE
        WHEN old.result = 'player1'
             THEN (SELECT id FROM smb3fi.users WHERE username = old.player1 LIMIT 1)
        WHEN old.result = 'player2'
             THEN (SELECT id FROM smb3fi.users WHERE username = old.player2 LIMIT 1)
        ELSE NULL
    END                              AS winner_id,
    'completed'                      AS status,
    NULL                             AS vod_url,
    (SELECT id FROM smb3fi.users WHERE username = 'admin' LIMIT 1) AS created_by

FROM smbfi_sm25.matches old
WHERE old.is_played = 1;

-- Tulevat / pelaamattomat ottelut (is_played = 0):
INSERT INTO smb3fi.matches (
    tournament_id, phase_id, group_id,
    player1_id, player2_id, host_id,
    match_format, scheduled_at, status, created_by
)
SELECT
    @new_tid,
    @phase_group,
    (SELECT tg.id FROM smb3fi.tournament_groups tg
     WHERE tg.tournament_id = @new_tid AND tg.name = old.group_name LIMIT 1),
    (SELECT id FROM smb3fi.users WHERE username = old.player1 LIMIT 1),
    (SELECT id FROM smb3fi.users WHERE username = old.player2 LIMIT 1),
    (SELECT id FROM smb3fi.users WHERE username = (
        SELECT username FROM smbfi_sm25.users WHERE id = old.host_id
    ) LIMIT 1),
    'points_only',
    CONCAT(old.match_date, ' ', old.match_time),
    'scheduled',
    (SELECT id FROM smb3fi.users WHERE username = 'admin' LIMIT 1)
FROM smbfi_sm25.matches old
WHERE old.is_played = 0 OR old.is_played IS NULL;
```

---

## Vaihe 4 — Päivitä standings

Kun ottelut on siirretty, päivitä lohkotilastot:

```sql
-- Lohkon A ID:
SET @gid_a := (SELECT id FROM smb3fi.tournament_groups WHERE tournament_id = @new_tid AND name = 'A');
SET @gid_b := (SELECT id FROM smb3fi.tournament_groups WHERE tournament_id = @new_tid AND name = 'B');

-- Lisää group_participants (jos ei ole):
INSERT IGNORE INTO smb3fi.group_participants (tournament_id, phase_id, group_id, user_id)
SELECT DISTINCT @new_tid, @phase_group,
    CASE
        WHEN p1.group_name = 'A' THEN @gid_a
        ELSE @gid_b
    END,
    u.id
FROM smb3fi.matches m
INNER JOIN smb3fi.users u ON u.id = m.player1_id OR u.id = m.player2_id
-- Tähän tarvitaan group_name tieto — täydennä tarvittaessa manuaalisesti
WHERE m.tournament_id = @new_tid;

-- Laske standings uudelleen
CALL recalc_all_standings(@new_tid);
-- TAI aja käsin kontrollerin kautta: /hallinta/turnaukset/{id}
```

---

## Vaihe 5 — Lohkoon lisäys manuaalisesti (suositeltu)

Koska vanha data voi olla epäsäännöllistä, **suositellaan** lisäämään pelaajat
lohkoihin käsin hallintapaneelin kautta sen jälkeen kun käyttäjät ja ottelut
on siirretty SQL:llä.

1. Kirjaudu `/hallinta`
2. Avaa turnaus
3. "Ilmoittautumiset" → hyväksy pelaajat
4. "Lohkot" → Lisää pelaaja lohkoon

---

## Vaihe 6 — Tarkistus

```sql
-- Onko pelaajat siirtynyt?
SELECT COUNT(*) FROM smb3fi.users WHERE status = 'active';

-- Onko ottelut siirtynyt?
SELECT status, COUNT(*) FROM smb3fi.matches
WHERE tournament_id = @new_tid GROUP BY status;

-- Onko standings oikein?
SELECT u.username, gp.wins, gp.losses, gp.points_for
FROM smb3fi.group_participants gp
INNER JOIN smb3fi.users u ON u.id = gp.user_id
WHERE gp.tournament_id = @new_tid
ORDER BY gp.group_id, gp.points_for DESC;
```

---

## Vanhan järjestelmän alasajo

Kun olet varmistanut että kaikki data on oikein uudessa järjestelmässä:

1. Vaihda webpalvelimen document root osoittamaan uuteen `public/`-kansioon
2. Testaa kaikki sivut
3. Poista vanha koodi palvelimelta:
   - `kisat/`
   - `matti/`
   - `kalervo/`
   - `smb3/`
   - `*.zip`-tiedostot
   - `smkisat.php` (julkinen sivu, korvattu uudella)
4. Pidä `backup_vanha_*.sql` tallessa vähintään 3 kuukautta
