def change_mode(self, new_mode):
        if new_mode == 'single_player_mode':
            self.board = DynamicBoard(WINDOW_SIZE)
            self.gui_view = DynamicGui(self.board, self.screen, controller = self)
            pygame.mixer.music.load('alejandro.ogg')
            pygame.mixer.music.play(-1)
            self.mode = "single_player"

        elif new_mode == 'multi_player_mode':
            self.gui_view = MultiplayerGui(self.screen, controller = self)
            self.mode = 'multi_player'

        elif new_mode == 'quiz_mode':
            self.board = StaticBoard(WINDOW_SIZE)
            self.gui_view = StaticGui(self.board, self.screen, controller = self)
            self.mode = "quiz"
            
        elif new_mode == 'instructions_mode':
            self.gui_view = InstructionsGui(self.board, self.screen, controller = self)
            self.mode = 'instructions'
            
        elif new_mode == 'summary_mode':
            self.gui_view = SummaryGui(self.board, self.screen, controller = self)
            self.mode = 'summary'
            
        elif new_mode == 'message_mode':
            self.gui_view = MessageGui(self.board, self.screen, controller = self)
            self.mode = 'message'
            
        elif new_mode == 'welcome_mode':
            self.gui_view = WelcomeGui(self.screen, controller = self)
            self.mode = 'welcome'

        elif new_mode == 'high_scores_mode':
            self.gui_view = HighScoresGui(self.board, self.screen, controller = self)
            self.mode = 'scores'
            
        elif new_mode == 'pause_mode':
#            pygame.mixer.music.fadeout(1000)
            self.gui_view = PauseGui(self.screen, controller = self)
            self.mode = 'pause'
            
        elif new_mode == 'lose_mode':
            self.gui_view = LoseGui(self.board, self.screen, controller = self)
            self.mode = 'lose'
            
        elif new_mode == 'win_mode':
            self.gui_view = WinGui(self.board, self.screen, controller = self)
            self.mode = 'win'
            
        elif new_mode == 'settings_mode':
            self.gui_view = SettingsGui(self.screen, controller = self)
            self.mode = 'settings'    
 def __init__(self, screen):
     self.screen = screen
     self.board = DynamicBoard(WINDOW_SIZE)
     self.gui_view = WelcomeGui(self.screen, controller=self)
     self.running = True
     self.mode = "welcome"
     self.quit_keys = [K_ESCAPE, K_q]
class GameController(object):
    '''Controller.'''
    def __init__(self, screen):
        self.screen = screen
        self.board = DynamicBoard(WINDOW_SIZE)
        self.gui_view = WelcomeGui(self.screen, controller=self)
        self.running = True
        self.mode = "welcome"
        self.quit_keys = [K_ESCAPE, K_q]
        
#    def generate_equation(self):
#        '''Create a new equation to pass to the models.'''
#        self.board.problem_count += 1     
#        return Equation(0)
        
    def exit_program(self):
        self.running = False

    def end_game(self):
        pygame.mixer.music.fadeout(1000)
        self.gui_view.end_game()
        
    def lose_game(self):
        self.change_mode('lose_mode')
        
    def win_game(self):
        self.change_mode('win_mode')
        
    def new_level(self):
        self.board.next_level()
        self.change_mode('message_mode')
        
        
    def update(self):
        '''Perform the appropriate actions for each mode.'''
        if pygame.event.peek(QUIT):
            self.exit_program()
        else:    
            if self.mode == "single_player" or self.mode == 'quiz':
                self._check_playing_events()
                self.board.update()               
            elif self.mode == "summary":
                self._check_summary_events()
            elif self.mode == 'message':
                self._check_message_events()
            elif self.mode == "pause":
                self._check_pause_events()
            elif self.mode == 'settings':
                self._check_settings_events()
            elif self.mode == "lose":
                self._check_lose_events()
            elif self.mode == "win":
                self._check_win_events()
            elif self.mode == "scores":
                self._check_scores_events()
            elif self.mode == "welcome":
                self._check_welcome_events()
            elif self.mode == 'multi_player':
                self._check_multi_player_events()
            elif self.mode == 'instructions':
                self._check_instructions_events()
         
    def _check_summary_events(self):
        for e in pygame.event.get():
            if e.type == KEYDOWN:
#                if e.key == K_RETURN:
#                    self.change_mode('welcome_mode')
#                    return
                if e.key == K_1:
                    self.change_mode('quiz_mode')
                    return
                elif e.key == K_2:
                    self.change_mode('welcome_mode')
                    return
                elif e.key == K_3:
                    self.exit_program()
                    return
                elif e.key in self.quit_keys:
                    self.exit_program()
                    return

            if self.gui_view.app:
                self.gui_view.app.event(e)
                    
    def _check_message_events(self):
        for e in pygame.event.get():
            if e.type == KEYDOWN:
                if e.key == K_RETURN:
                    self.return_to_mode('single_player_mode')
                    return

            if self.gui_view.app:
                self.gui_view.app.event(e)
                
    def _check_instructions_events(self):
        for e in pygame.event.get():
            if e.type == KEYDOWN:
                if e.key == K_RETURN:
                    self.change_mode('single_player_mode')
                elif e.key in self.quit_keys:
                    self.change_mode('welcome_mode')

            if self.gui_view.app:
                self.gui_view.app.event(e)

    def _check_welcome_events(self):
        for event in pygame.event.get():
            if event.type == KEYDOWN:
                if event.key in self.quit_keys:
                    self.exit_program()
                elif event.key == K_1:
                    self.change_mode('instructions_mode')
                elif event.key == K_2:
                    self.change_mode('multi_player_mode')
                elif event.key == K_3:
                    self.change_mode('quiz_mode')
                elif event.key == K_4:
                    self.change_mode('high_scores_mode')
                elif event.key == K_s:
                    self.change_mode('settings_mode')
#            else:
                # pass events to PGU
            if self.gui_view.app:
                self.gui_view.app.event(event)
                
    def _check_pause_events(self):
        for event in pygame.event.get():
            if event.type == KEYDOWN:
                if event.key in self.quit_keys:
                    self.end_game()
                    return
                elif event.key == K_SPACE:
                    self.return_to_mode('single_player_mode')
                    return
            
            if self.gui_view.app:
                    self.gui_view.app.event(event)
                
    def _check_lose_events(self):
        for e in pygame.event.get():
            if e.type == KEYDOWN:
#                if e.key == K_RETURN:
#                    self.change_mode('welcome_mode')
#                    return
                if e.key == K_1:
                    self.change_mode('single_player_mode')
                    return
                elif e.key == K_2:
                    self.change_mode('welcome_mode')
                    return
                elif e.key == K_3:
                    self.exit_program()
                    return
                elif e.key in self.quit_keys:
                    self.exit_program()
                    return
            
            if self.gui_view.app:
                    self.gui_view.app.event(e)

    def _check_win_events(self):
        for e in pygame.event.get():
            if e.type == KEYDOWN:
#                if e.key == K_RETURN:
#                    self.change_mode('welcome_mode')
#                    return
                if e.key == K_1:
                    self.change_mode('single_player_mode')
                    return
                elif e.key == K_2:
                    self.change_mode('welcome_mode')
                    return
                elif e.key == K_3:
                    self.exit_program()
                    return
                elif e.key in self.quit_keys:
                    self.exit_program()
                    return
            
            if self.gui_view.app:
                    self.gui_view.app.event(e)

    def _check_scores_events(self):
        for e in pygame.event.get():
            if e.type == KEYDOWN:
                if e.key == K_RETURN or e.key in self.quit_keys:
                    self.change_mode('welcome_mode')
                    return
            
            if self.gui_view.app:
                    self.gui_view.app.event(e)   
                
    def _check_settings_events(self):
        for e in pygame.event.get():
            if e.type == KEYDOWN:
                if e.key == K_RETURN or e.key in self.quit_keys:
                    self.change_mode('welcome_mode')
            
            if self.gui_view.app:
                    self.gui_view.app.event(e)
                
    def _check_multi_player_events(self):
        for e in pygame.event.get():
            if e.type == KEYDOWN:
                if e.key == K_RETURN or e.key in self.quit_keys:
                    self.change_mode('welcome_mode')
            
            if self.gui_view.app:
                    self.gui_view.app.event(e)
                

    def _check_playing_events(self):
        number_keys = [K_0, K_1, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9]
        number_key_dict = dict(zip(number_keys, range(10)))
        input_length = len(self.board.current_input)
        
        if self.board.mode == "game_over":
            self.end_game()
        elif self.board.mode == "lose":
            self.lose_game()
        elif self.board.mode == "win":
            self.win_game()        
        elif self.board.mode == "level_break":
            self.new_level()
        
        else:
            for event in pygame.event.get():
                if event.type == KEYDOWN:
                    # Clear message from screen
                    self.gui_view.message = None
                    # Only take user input if not displaying a message
                    if event.key in self.quit_keys:
                        self.end_game()
                    elif event.key == K_RETURN and input_length > 0:
                        self.board.check_ans()
                        
                    elif not (self.board.display_correct or self.board.display_incorrect):
                        # Only allows 3 digits of input
                        if event.key in number_keys and input_length < 3:
                            self.board.current_input.append(number_key_dict[event.key]) 
                        
                        elif event.key == K_BACKSPACE and input_length > 0:
                            self.board.current_input.pop()
                            
                        elif event.key == K_SPACE and self.mode == 'single_player':
                            self.change_mode('pause_mode')
                        # Won't display the message with backspace or extra digits                                                
                        elif event.key != K_BACKSPACE and input_length < 3:
                            self.gui_view.message = "Must input a number" 
      
      
    def change_mode(self, new_mode):
        if new_mode == 'single_player_mode':
            self.board = DynamicBoard(WINDOW_SIZE)
            self.gui_view = DynamicGui(self.board, self.screen, controller = self)
            pygame.mixer.music.load('alejandro.ogg')
            pygame.mixer.music.play(-1)
            self.mode = "single_player"

        elif new_mode == 'multi_player_mode':
            self.gui_view = MultiplayerGui(self.screen, controller = self)
            self.mode = 'multi_player'

        elif new_mode == 'quiz_mode':
            self.board = StaticBoard(WINDOW_SIZE)
            self.gui_view = StaticGui(self.board, self.screen, controller = self)
            self.mode = "quiz"
            
        elif new_mode == 'instructions_mode':
            self.gui_view = InstructionsGui(self.board, self.screen, controller = self)
            self.mode = 'instructions'
            
        elif new_mode == 'summary_mode':
            self.gui_view = SummaryGui(self.board, self.screen, controller = self)
            self.mode = 'summary'
            
        elif new_mode == 'message_mode':
            self.gui_view = MessageGui(self.board, self.screen, controller = self)
            self.mode = 'message'
            
        elif new_mode == 'welcome_mode':
            self.gui_view = WelcomeGui(self.screen, controller = self)
            self.mode = 'welcome'

        elif new_mode == 'high_scores_mode':
            self.gui_view = HighScoresGui(self.board, self.screen, controller = self)
            self.mode = 'scores'
            
        elif new_mode == 'pause_mode':
#            pygame.mixer.music.fadeout(1000)
            self.gui_view = PauseGui(self.screen, controller = self)
            self.mode = 'pause'
            
        elif new_mode == 'lose_mode':
            self.gui_view = LoseGui(self.board, self.screen, controller = self)
            self.mode = 'lose'
            
        elif new_mode == 'win_mode':
            self.gui_view = WinGui(self.board, self.screen, controller = self)
            self.mode = 'win'
            
        elif new_mode == 'settings_mode':
            self.gui_view = SettingsGui(self.screen, controller = self)
            self.mode = 'settings'    
            
#        else:
#            raise AttributeError

    def return_to_mode(self, mode):
        if mode == 'single_player_mode':
            self.gui_view = DynamicGui(self.board, self.screen, controller = self)
            self.mode = "single_player"
            
    
    def draw(self):
        '''Draw'''
        self.gui_view.draw()