# Social Content Generator — Design Spec

## Overview

Komenda Symfony `app:generate-social-content` generująca gotowe posty na Instagram/TikTok z danych misji w bazie.

## Architektura

### Komponenty

- **`GenerateSocialContentCommand`** — CLI entry point
  - Opcje: `--week=YYYY-WW`, `--text-only`, `--force`
  - Domyślnie: bieżący tydzień
- **`SocialContentService`** — logika biznesowa
  - Selekcja 7 misji na tydzień (rotacja postaci, mix lokalizacji/trudności)
  - Generowanie 3 wariantów tekstów per misja
  - Zarządzanie historią (`var/social-history.json`)
- **`SocialImageGenerator`** — generowanie grafik 1080x1080 PNG przez GD
  - Pastelowe tło w kolorze postaci
  - Tekst wycentrowany (Inter TTF via `imagettftext()`)
  - Emoji postaci w rogu, logo "TROPO" na dole

### Flow

1. Pobierz misje z DB (Entity `Mission`)
2. Wyfiltruj 7 misji:
   - Rotacja postaci: scout → blitz → nova → echo → scout → blitz → nova
   - Mix lokalizacji (dom/teren) i trudności (easy/medium)
   - Unikanie misji użytych w poprzednich tygodniach (chyba że `--force`)
3. Dla każdej misji wygeneruj 3 warianty:
   - **Zagadka** — `riddle_text` z losowego kroku misji
   - **Ciekawostka** — `fun_fact` z losowego kroku misji
   - **Cytat** — losowy z hardcoded puli (~10 per postać)
4. Dla każdego wariantu:
   - Tekst posta (max 200 znaków + hashtagi, max 15 hashtagów)
   - Grafika 1080x1080 PNG (chyba że `--text-only`)
5. Zapisz do `var/social-content/week-YYYY-WW/`
6. Zaktualizuj `var/social-history.json`

## Output Structure

```
var/social-content/week-2026-12/
├── manifest.json
├── 01-scout/
│   ├── zagadka/
│   │   ├── post.txt
│   │   ├── image.png
│   │   └── meta.json
│   ├── ciekawostka/
│   │   ├── post.txt
│   │   ├── image.png
│   │   └── meta.json
│   └── cytat/
│       ├── post.txt
│       ├── image.png
│       └── meta.json
├── 02-blitz/
│   └── ...
└── 07-nova/
    └── ...
```

### manifest.json

```json
{
  "week": "2026-12",
  "generated_at": "2026-03-18T10:00:00+01:00",
  "posts": [
    {
      "day": "monday",
      "directory": "01-scout",
      "character": "scout",
      "variants": ["zagadka", "ciekawostka", "cytat"],
      "mission_id": "scout_park_medium_012",
      "caption_preview": "Pierwsze 50 znaków..."
    }
  ]
}
```

## Grafika (GD)

- Wymiary: 1080x1080 px
- Tło: pastelowa wersja koloru postaci (jasność +60%)
- Akcenty: pełny kolor postaci (scout=#3578E5, blitz=#E8612A, nova=#7C3AED, echo=#16A34A)
- Tekst: wycentrowany, max 3 linijki, font Inter TTF (bold), ciemny kolor
- Emoji postaci: lewy górny róg, duży
- Logo "TROPO": na dole, wycentrowane
- Font: `var/fonts/Inter-Bold.ttf` (do pobrania/dodania)

## Hashtagi

Stały zestaw per post (max 15):
- Zawsze: `#TROPO #TROPOapp #edukacjaprzezzabawę #aplikacjadladzieci`
- Per postać: `#ScoutTropiciel` / `#BlitzChallenge` / `#NovaOdkrywa` / `#EchoNatura`
- Per lokalizacja: `#zabawywparku` / `#zabawywdomu`
- 2-3 generyczne: `#zagadkidladzieci #ciekawostkidladzieci #mamahack`

## Cytaty postaci (hardcoded)

~10 per postać, ton ciepły, z perspektywy postaci:
- Scout: tropiciel, zagadki, odkrywanie ("Hej, mam dla Ciebie zagadkę! 🐕")
- Blitz: szybki, energiczny, wyzwania ("Kto pierwszy rozwiąże? Na start! 🐇")
- Nova: ciekawska, naukowa, wynalazki ("Czy wiesz, że...? 🦝")
- Echo: mądry, spokojny, natura ("Posłuchaj, co mówi natura... 🐢")

## Historia (`var/social-history.json`)

```json
{
  "weeks": {
    "2026-12": ["scout_park_medium_012", "blitz_home_easy_005", ...],
    "2026-11": [...]
  }
}
```

- `--force` ignoruje historię przy selekcji
- Historia rośnie — stare tygodnie nie są usuwane

## Komendy

```bash
php bin/console app:generate-social-content              # bieżący tydzień
php bin/console app:generate-social-content --week=2026-14
php bin/console app:generate-social-content --text-only   # bez grafik
php bin/console app:generate-social-content --force        # ignoruj historię
```

## Decyzje

- **GD** do grafik (zero nowych zależności, wystarczy dla prostego layoutu)
- **Treści prosto z misji** (zagadki, fun_facty) + hardcoded cytaty postaci
- **Bez AI** — deterministyczne, offline, bez kosztów
- **3 warianty w podkatalogach** per misja — użytkownik wybiera ręcznie
