"""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ě.
V každé scéně vyplň nejprve reveal: jednu skutečnou, bezpečně známou událost. Potom setup situace těsně před ní, bez odpovědi, a jednu konkrétní otázku na tuto událost. A vždy stručně vyjadřuje stejnou skutečnost jako reveal; correct je vždy A. B, C, D vytvoř až nakonec jako nepravdivé alternativy. Písmena pro hráče později promíchá hra, nemusíš je vyvažovat. Události, postavy ani pořadí kvůli zajímavosti neměň.
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,"reveal":"skutečná událost","setup":"situace před ní","question":"otázka na událost","options":{"A":"skutečná akce","B":"jiná možnost","C":"jiná možnost","D":"jiná možnost"},"correct":"A"}],"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'
               'Sestav hru z jistých skutečných událostí. Pestrost patří do otázek a chybných možností, nikoli do 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
