from player_sensehat import PlayerSenseHat
from game_token import GameToken
from game_logic import GameLogicSenseHat
from game_state import GameState
from drop_state import DropState
from sense_hat import SenseHat
import time

class Coordinator:
    def __init__(self):
        self.sense = SenseHat()
        self.sense.set_rotation(180)
        # Initialize players with SenseHat display
        self._player_red = PlayerSenseHat(GameToken.RED)
        self._player_yellow = PlayerSenseHat(GameToken.YELLOW)
        self._game = GameLogicSenseHat()

    def show_game_message(self, message: str, color=(255, 255, 0)):
        self.sense.show_message(message, text_colour=color, scroll_speed=0.0375)

    def run(self):
        self.show_game_message("Connect 4", (0, 255, 0))
        
        while True:
            state = self._game.get_state()
            
            if state in [GameState.WON_RED, GameState.WON_YELLOW, GameState.DRAW]:
                if state == GameState.WON_RED:
                    self.show_game_message("Red Wins!", (255, 0, 0))
                elif state == GameState.WON_YELLOW:
                    self.show_game_message("Yellow Wins!", (255, 255, 0))
                else:
                    self.show_game_message("Draw!", (0, 255, 255))
                break
            
            current_player = self._player_red if state == GameState.TURN_RED else self._player_yellow
            current_token = GameToken.RED if state == GameState.TURN_RED else GameToken.YELLOW
            
            try:
                current_player.draw_board(self._game.get_board(), state)
                column = current_player.play_turn()
                drop_result = self._game.drop_token(current_token, column)
                
                if drop_result != DropState.DROP_OK:
                    continue
                    
            except KeyboardInterrupt:
                self.show_game_message("Game Over")
                self.sense.clear()
                break

if __name__ == '__main__':
    coordinator = Coordinator()
    try:
        coordinator.run()
    finally:
        coordinator.sense.clear()