"""Pure Story presentation; hidden revelations never enter visible properties early."""
from wcs.games.story.content import CHAPTERS, COUNTS, LETTERS

CHAPTER_LABELS = tuple(range(35410, 35415))
FIELDS = ('Narration', 'Question', 'Reveal', 'Ending', 'Aftermath', 'Headline', 'PrimaryLabel', 'SourceNote', 'Lives', 'AnsweredCount', 'CorrectCount', 'QuestionCount',
          'SceneLabel', 'Chapter', 'ChapterLabel', 'YourLetter', 'YourText', 'RightLetter', 'RightText', 'Result',
          'Outcome', 'Error', 'Score', 'Progress') + tuple('Opt' + letter for letter in LETTERS) + tuple(
              'State' + letter for letter in LETTERS) + tuple(
              'Chapter.{}.{}'.format(number, kind) for number in range(1, CHAPTERS + 1) for kind in ('State', 'Progress'))


def view(engine, screen, difficulty, translate, error=''):
    data = dict.fromkeys(FIELDS, '')
    count = COUNTS[difficulty]
    data.update(QuestionCount=str(count), Lives=str(engine.lives if engine else 3), Error=error)
    if not engine or not engine.pack:
        return data
    data.update(AnsweredCount=str(engine.answered), CorrectCount=str(engine.correct),
                Chapter=str(engine.scene.chapter), ChapterLabel=translate(CHAPTER_LABELS[engine.scene.chapter - 1]),
                Score='{} / {}'.format(engine.correct, engine.answered), Progress='{} / {}'.format(engine.answered, count))
    size = count // CHAPTERS
    for number in range(1, CHAPTERS + 1):
        done = max(0, min(size, engine.answered - (number - 1) * size))
        data['Chapter.{}.Progress'.format(number)] = '{} / {}'.format(done, size)
        data['Chapter.{}.State'.format(number)] = ('done' if done == size else
                                                  'current' if number == engine.scene.chapter else 'todo')
    scene = engine.scene
    data['SceneLabel'] = translate(35425).format(engine.index + 1, count)
    if screen == 'question':
        data.update(Narration=scene.setup, Question=scene.question)
    if screen in ('question', 'feedback', 'win', 'gameover', 'results'):
        for index, letter in enumerate(LETTERS):
            data['Opt' + letter] = scene.options[index]
    if engine.selected is not None:
        right = engine.selected == scene.correct
        data.update(Reveal=scene.reveal, YourLetter=LETTERS[engine.selected], YourText=scene.options[engine.selected],
                    RightLetter=LETTERS[scene.correct], RightText=scene.options[scene.correct],
                    Result=translate(35419 if right else 35420), Outcome='correct' if right else 'wrong')
        data['State' + LETTERS[scene.correct]] = 'correct'
        if not right:
            data['State' + LETTERS[engine.selected]] = 'wrong'
    if engine.state == 'won':
        data['Ending'] = engine.pack.ending
    data['Aftermath'] = ' '.join(text for text in (data['Reveal'], data['Ending']) if text)
    data['Headline'] = translate(35415 if engine.state == 'won' else 35416 if engine.state == 'lost' else
                                35419 if data['Outcome'] == 'correct' else 35420)
    data['PrimaryLabel'] = translate(35417 if engine.state == 'feedback' else 35418)
    return data
