import random
from time import ticks_ms, ticks_diff
ROUND_TIME_MS = 10000
FEEDBACK_TIME_MS = 700

MOVES = [
    "UP",
    "DOWN",
    "LEFT",
    "RIGHT",
    "A",
    "B",
]

class PracticeGame:

    def __init__(self):
        self.sequence_length = 5
        self.streak = 0

        self.new_round()

        self.position = 0
        self.failed = False
        self.success = False

    def new_round(self):

        self.sequence = []

        for _ in range(self.sequence_length):
            self.sequence.append(random.choice(MOVES))

        self.position = 0

        self.state = "PLAYING"
        self.outcome = None

        # Remember when this round began
        self.round_start = ticks_ms()
        
    def finish_round(self, success):

        self.state = "FEEDBACK"
        self.feedback_start = ticks_ms()

        if success:
            self.outcome = "SUCCESS"

            self.streak += 1

        else:
            self.outcome = "MISS"

            self.streak = 0
        
    
    def handle_press(self, press):

        if self.state != "PLAYING":
            return

        expected = self.sequence[self.position]

        if press == expected:

            self.position += 1

            if self.position >= len(self.sequence):
                self.finish_round(True)

        else:
            self.finish_round(False)
    
    def update(self):

        now = ticks_ms()

        if self.state == "PLAYING":

            elapsed = ticks_diff(now, self.round_start)

            # check time bar progress here
            if elapsed > ROUND_TIME_MS:
                self.finish_round(False)

        elif self.state == "FEEDBACK":

            elapsed = ticks_diff(now, self.feedback_start)

            if elapsed >= FEEDBACK_TIME_MS:
                self.new_round()
                
    def time_fraction(self):

        if self.state != "PLAYING":
            return 0

        elapsed = ticks_diff(ticks_ms(), self.round_start)

        remaining = ROUND_TIME_MS - elapsed

        if remaining < 0:
            remaining = 0

        return remaining / ROUND_TIME_MS
