"""Small pure rules engine. Answers recall one canonical plot; they never branch it."""


class Engine:
    def __init__(self, pack):
        self.pack = pack
        self.state = 'question'
        self.index = 0
        self.lives = 3
        self.answered = 0
        self.correct = 0
        self.selected = None

    @property
    def scene(self):
        return self.pack.scenes[self.index] if self.pack is not None else None

    def answer(self, index):
        if self.state != 'question' or type(index) is not int or not 0 <= index < 4:
            return False
        self.selected = index
        self.answered += 1
        if index == self.scene.correct:
            self.correct += 1
        else:
            self.lives -= 1
        self.state = ('lost' if self.lives == 0 else
                      'won' if self.answered == len(self.pack.scenes) else 'feedback')
        return True

    def advance(self):
        if self.state != 'feedback':
            return False
        self.index += 1
        self.selected = None
        self.state = 'question'
        return True

    def close(self):
        self.state = 'closed'
        self.pack = None
