# API Endpoint: Complete Profile (Pozvánka)

## `POST /api/pedigree/complete-profile`

Voláno z formuláře pozvánky (`pozvanka.php`), když cizí chovatel doplní profil svého psa pro rodokmen.

---

## Request Body (JSON)

```json
{
  "dog_name": "Grace Silver Shadow",
  "station": "Silver Shadow",
  "pp": "CMKU/SHE/8012/19",
  "email": "chovatel@email.cz",
  "color": "tricolor",
  "health_tests": ["HD: A/A", "ED: 0/0", "PRA: clear"],
  "titles": ["Šampion ČR", "CACIB"],
  "exams": ["BH", "ZOP"],
  "photo": "data:image/jpeg;base64,...",
  "from_station": "Z Krásného údolí",
  "role": "father"
}
```

| Pole | Typ | Povinné | Popis |
|------|-----|---------|-------|
| `dog_name` | string | ano | Celé jméno psa včetně stanice |
| `station` | string | ano | Chovatelská stanice odesílatele |
| `pp` | string | ne | Číslo průkazu původu |
| `email` | string | ano | Email odesílatele (majitele psa) |
| `color` | string | ne | Barva / varieta |
| `health_tests` | string[] | ne | Zdravotní testy ve formátu "Test: Výsledek" |
| `titles` | string[] | ne | Výstavní tituly |
| `exams` | string[] | ne | Zkoušky a certifikace |
| `photo` | string | ne | Fotka psa jako base64 data URI |
| `from_station` | string | ano | Název stanice, která pozvánku poslala |
| `role` | string | ano | Role psa v rodokmenu (`father` / `mother`) |

---

## Co musí endpoint udělat

### 1. Uložit/aktualizovat profil psa

- Najít existující profil psa podle `pp` nebo `dog_name` + `station`
- Pokud neexistuje, vytvořit nový
- Uložit všechna odeslaná data (jméno, stanice, PP, barva, zdravotní testy, tituly, zkoušky)
- Pokud je `photo` přítomné, uložit fotku (resize, upload na storage)

### 2. Vytvořit nebo propojit uživatelský účet

- Najít uživatele podle `email`
- Pokud neexistuje, vytvořit "lazy" účet (bez hesla, aktivovaný přes magic link)
- Propojit profil psa s tímto uživatelem jako majitelem

### 3. Odeslat magic link email odesílateli

**Příjemce:** `email` (majitel psa)

**Předmět:** Profil psa {dog_name} byl uložen — odkaz pro správu

**Obsah emailu:**
- Potvrzení, že profil byl uložen
- Magic link (jednorázový token, platnost 30 dní) na správu profilu psa
- Odkaz vede přímo na detail psa v účtu chovatele (ne na login s heslem!)

**Technicky:**
- Vygenerovat `magic_token` (random, unikátní, 64 znaků)
- Uložit do tabulky `magic_links` s `user_id`, `token`, `expires_at` (now + 30 dní), `redirect_url`
- URL: `https://pedia.dog/auth/magic/{token}` → ověří token, přihlásí uživatele, redirect na profil psa

### 4. Vytvořit systémovou notifikaci pro žádající stanici

**Příjemce:** Majitel stanice `from_station`

**Kam:** Nástěnka účtu chovatele → sekce "Doporučení a novinky" (`ucet-chovatele-ukoly.php`)

**Formát notifikace** (stejný jako stávající zelené hlášky v systému):

```html
<div class="task-item task-item--success">
    <div class="task-item__icon">
        <!-- Zelená fajfka -->
        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none"
             stroke="currentColor" stroke-width="2">
            <path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"/>
            <polyline points="22 4 12 14.01 9 11.01"/>
        </svg>
    </div>
    <div class="task-item__content">
        <span class="task-item__text">
            Stanice <span class="breeder__urgent-highlight">{station}</span>
            doplnila profil {role_word}
            <span class="breeder__urgent-highlight">{dog_name}</span>
            pro váš rodokmen.
        </span>
        <span class="task-item__meta">Právě teď</span>
        <a href="ucet-chovatele-nasi-psi-detail.php?id={dog_id}"
           class="task-item__detail-link">Zobrazit profil →</a>
    </div>
    <button type="button" class="task-item__dismiss" title="Skrýt">×</button>
</div>
```

**Databázový záznam:**

| Pole | Hodnota |
|------|---------|
| `user_id` | ID majitele stanice `from_station` |
| `type` | `pedigree_completed` |
| `level` | `success` (zelená) |
| `text` | `Stanice {station} doplnila profil {role_word} {dog_name} pro váš rodokmen.` |
| `link_url` | `ucet-chovatele-nasi-psi-detail.php?id={dog_id}` |
| `link_text` | `Zobrazit profil →` |
| `created_at` | now |
| `read_at` | NULL |
| `dismissed_at` | NULL |

**Žádný email se neposílá** — notifikace je čistě v systému.

### 5. Propojit psa v rodokmenu

- Najít rodokmen, kde `from_station` žádala o doplnění tohoto psa
- Propojit nově vytvořený/aktualizovaný profil s pozicí v rodokmenu
- Změnit status z "Nekompletní" na "Čeká na schválení" nebo "Ověřeno" (podle logiky)

---

## Response

### Úspěch (200)
```json
{
  "success": true,
  "dog_id": 1234,
  "message": "Profil byl uložen a odkaz odeslán na email."
}
```

### Chyba validace (422)
```json
{
  "success": false,
  "message": "Chybí povinné pole: email",
  "errors": {
    "email": ["Toto pole je povinné"]
  }
}
```

### Chyba serveru (500)
```json
{
  "success": false,
  "message": "Interní chyba serveru"
}
```

---

## Bezpečnost

- Rate limiting: max 5 requestů za minutu na IP
- Validace emailu (formát + MX záznam)
- Sanitizace všech vstupů
- Fotka: max 10 MB, validovat MIME type, resize na max 1200px
- Magic link token: cryptographically secure random, single-use nebo time-limited
- CSRF ochrana není nutná (API endpoint, ne form POST)

---

## Databázové tabulky (dotčené)

- `dogs` — profil psa
- `users` — uživatelský účet (lazy vytvoření)
- `magic_links` — tokeny pro přihlášení bez hesla
- `messages` — systémové zprávy v účtu chovatele
- `pedigree_ancestors` — propojení v rodokmenu
- `dog_health_tests` — zdravotní testy
- `dog_titles` — tituly
- `dog_exams` — zkoušky
