# Architektura

## 1. Klient

Klientská část je v `client/index.html`, `client/assets/style.css` a `client/assets/app.js`.

Princip:

1. Hráč odehraje krátkou relaci maximálně 90 sekund.
2. Výsledek se vždy uloží do `LocalStorage`.
3. Klient se pokusí najít dostupné PHP API.
4. Když server odpoví, odešle pouze dosud nesynchronizované výsledky.
5. Když server neodpoví, výsledek zůstane ve frontě a odešle se později ručně tlačítkem nebo při další návštěvě.

Klient nepotřebuje databázové údaje. Nikdy se nepřipojuje přímo do MySQL.

## 2. Server

Serverová část je v `server/`.

- `index.php` zobrazuje katalog her a leaderboard.
- `api.php` obsluhuje API.
- `install.php` založí tabulky a ověří připojení.
- `moderation.php` řeší ruční schválení podezřelých jmen.
- `config.php` obsahuje konfiguraci DB, hry a API.
- `lib/` obsahuje databázové a aplikační funkce.

Server vytváří a udržuje dvě hlavní tabulky:

- `pef_games` - katalog her.
- `pef_scores` - výsledky jednotlivých odehraných her.

## 3. Datový tok

```text
Hráč -> klientská hra -> LocalStorage
                      -> pokud API dostupné: POST server/api.php?action=submit_score
Server API -> MySQL -> server/index.php + server/api.php?action=leaderboard
```

## 4. Vyhodnocení pořadí

Pro hru `Signální dispečer` platí:

```text
Primární pořadí: score DESC
Sekundární pořadí: time_ms ASC
```

To znamená, že vyšší skóre je lepší. Při shodném skóre vyhrává kratší čas.

## 5. Moderace

Uživatelské jméno server nikdy neposílá přímo do veřejného leaderboardu bez zpracování.

Server provádí:

- ořez délky,
- odstranění HTML a řídicích znaků,
- odstranění nepovolených znaků,
- detekci odkazů a e-mailů,
- jednoduchý filtr nevhodných slov a SQL/HTML podezřelých vzorů.

Bezpečné záznamy dostanou stav `approved`. Podezřelé záznamy dostanou stav `pending` a veřejně se nezobrazují, dokud je moderátor neschválí.

## 6. Offline režim

Offline režim není chyba. Je to záměr:

- hra běží dál,
- skóre se ukládá lokálně,
- synchronizace se zopakuje při dalším pokusu,
- návštěvník nemusí čekat na server.
