"""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 o přesně zadaném díle z vlastní znalosti, bez vyhledávání. Všechna textová pole scén, ending a reason piš česky. Identitu přesně opiš; anotace slouží pouze k identifikaci díla.
Vyber spolehlivě známé konkrétní akce a události od začátku po skutečný konec. Zachovej pořadí, v jakém je vidí divák, včetně vložených scén jiných postav a flashbacků. Nemíchej adaptace, pokračování ani jiné epizody. U pokračujícího seriálu konči u známého vydaného děje. Správné pořadí a fakta mají přednost před pestrostí či obtížností.
Každá scéna se ptá, co postava udělá nebo co se právě stane. Může sledovat protagonistu i jinou postavu. Vynech trivia, doslovné citáty, výklady proroctví a otázky na názory. Pokud si nejsi jistý událostí, vyber jinou; zkrácené vyprávění nesmí vymyslet příčinu, místo, aktéra nebo přechod.
Vyplň reveal jako jednu větu jediné skutečné události, ideálně do 100 znaků. Potom setup jako jednu neutrální větu situace těsně před ní, ideálně do 90 znaků. Uváděj jen potřebný kontext; vynech nepodstatné doplňky. Question se ptá na tuto událost. Setup ani question neprozrazují odpověď. Reveal pouze uzavře tento okamžik, nepřidává další děj. Následující scéna pokračuje ve skutečném příběhu bez ohledu na hráčovu chybu.
A je stručná pravdivá odpověď shodná s reveal a correct je A. Až potom vytvoř B, C, D: věrohodné, odlišné, v tomto okamžiku nepravdivé alternativy. Písmena hra následně promíchá. Každá možnost má 1–3 slova, ideálně 12–22 znaků, maximálně 30 včetně mezer. Postavu pojmenuj v otázce místo opakování v možnostech. Nikdy neusekávej slova. Přesná otázka musí mít právě jednu správnou možnost; ostatní nesmí popisovat jiný současně pravdivý krok. Otázky neopakuj.
Chapter je pouze poziční číslo podle zadané posloupnosti, nikoli tematická kapitola. Kvůli němu události nepřeskupuj. Ending je jedna krátká věta skutečného závěru bez domyšleného pokračování. Žádný moderátor, skóre, pravidla, peníze, gratulace, značky nebo hranaté závorky.
Pokud neznáš celý zadaný příběh dostatečně spolehlivě, vrať pouze {"schema_version":1,"status":"unavailable","reason":"stručný důvod"}. Jinak vrať pouze kompletní JSON:
{"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"}
Před odesláním ověř přesný počet scén, posloupnost chapter, délky a soulad setup, question, správné možnosti a reveal. 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. Všechna textová pole scén a závěr napiš česky.').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
