"""Compact Czech narrator instructions; no presenter and no stored game history."""
import json

from wcs.games.story.content import COUNTS, LIMITS


def identity(subject):
    return {'title': subject.title, 'year': int(subject.year) if subject.year not in (None, '') else None,
            'media_type': 'series' if subject.media_type in ('tv', 'episode') else subject.media_type,
            'season_number': int(subject.season_number) if subject.season_number not in (None, '') else None,
            'episode_number': int(subject.episode_number) if subject.episode_number not in (None, '') else None,
            'episode_title': subject.episode_title or ''}


def build(subject, difficulty):
    count = COUNTS[difficulty]
    detail = {'easy': 'zásadní, snadno rozpoznatelné události',
              'medium': 'zásadní události i důležité mezikroky',
              'hard': 'jemnější spolehlivě známé dějové detaily'}[difficulty]
    system = '''Připrav hru Příběh: stručné české vyprávění a dějové otázky o přesně zadaném díle. Použij vlastní znalost díla, žádné vyhledávání. Anotace pouze identifikuje dílo.
Pokryj celý zadaný film, seriál nebo epizodu od začátku po závěr v pořadí, v jakém děj odhaluje autor, včetně flashbacků. Nemíchej adaptace ani jiné díly. U pokračujícího seriálu konči u známého vydaného děje, nevymýšlej finále.
Vybírej konkrétní události a jednání, které spolehlivě znáš. Pravdivé musí být i všechny věty setup, reveal a ending: nepřidávej domyšlené přechody, náznaky či vysvětlení. Kontroluj pořadí scén, místa, kdo komu pomůže a kdo co udělá. Nezaměňuj podobné scény. Nejisté detaily, doslovné citáty a výklady proroctví vynech; raději vyber jiný známý dějový okamžik.
Scéna má setup (1–2 krátké věty aktuální situace), question (jednu otázku co se právě stane nebo co postava udělá), čtyři odlišné možnosti A–D, correct (jedinou správnou) a reveal (1–2 věty skutečného výsledku tohoto okamžiku). Sleduj protagonistu či jinou relevantní postavu, ne vždy povinně protagonistu. Následující scéna pokračuje v témže skutečném ději i po hráčově chybě.
Setup ani question nesmí odpověď prozradit. Reveal uzavře jen dotazovanou událost, nepředbíhá k pozdějším zvratům. Ending je stručný skutečný konec vybraného příběhu, ne domyšlený další vývoj.
Každá možnost je krátké jméno nebo akce bez opakování otázky: zpravidla 1–3 slova, ideálně 12–22 znaků včetně mezer, nikdy přes 30. Postavu pojmenuj v otázce, ne znovu v každé možnosti. Zkracuj smysluplnou formulací, ne useknutím slov. Tři chybné možnosti jsou věrohodné alternativy a v dotazovaném okamžiku nepravdivé. Vynech všechny/žádná, vtipy a subjektivní či dvojznačné odpovědi. Otázky neopakuj.
Žádní herci, tvůrci, ceny nebo jiné trivia. Žádný moderátor, gratulace, peníze, pravidla, čísla kol či výplňové řeči. Piš klidně a úsporně, bez hranatých závorek a formátovacích značek. Identitu přesně opiš, nepřekládej její název.
Pokud nemáš dost spolehlivých znalostí na celý zadaný příběh, vrať {"schema_version":1,"status":"unavailable","reason":"stručný důvod"}. Mezeru nenahrazuj vymyšlenou scénou.
Jinak vrať pouze kompletní JSON podle tohoto kontraktu:
{"schema_version":1,"status":"ready","identity":<přesně zadaná identita>,"difficulty":<zadaná obtížnost>,"scenes":[{"chapter":1,"setup":"situace","question":"otázka","options":{"A":"možnost","B":"možnost","C":"možnost","D":"možnost"},"correct":"A","reveal":"skutečný průběh"}],"ending":"závěr"}
Kapitoly 1–5 znamenají Začátek, Rozjezd, Zlom, Vyvrcholení, Závěr. Před odesláním ověř přesný počet scén, předepsanou posloupnost chapter a limity všech textů; příliš dlouhou možnost přeformuluj. Nevypisuj kontrolu ani rozbor.'''
    lengths = ', '.join('{} <= {} znaků'.format(key, value) for key, value in LIMITS.items())
    chapters = [index // (count // 5) + 1 for index in range(count)]
    request = ('Identita: {}\nObtížnost: {} ({}). Přesně {} scén, po {} v každé z pěti kapitol.\n'
               'Posloupnost chapter přesně: {}.\nLimity: {}. Možnosti cíluj na 12–22 znaků, maximálně 30 včetně mezer.\nIdentifikační anotace: {}\n'
               'Vytvoř celý nový balíček; obměň výběr událostí a formulace při zachování skutečného děje.').format(
                   json.dumps(identity(subject), ensure_ascii=False), difficulty, detail, count, count // 5,
                   json.dumps(chapters), lengths, subject.plot[:1200] or '(není)')
    return system, request
