from display_base import DisplayBase  # base class for output methods
from input_console import InputConsole
from player_base import PlayerBase
from game_state import GameState
from game_token import GameToken
from ansi import Ansi
from display_console import DisplayConsole
from input_console import Keys

class PlayerConsole(PlayerBase):
    def __init__(self, player: GameToken):
        super().__init__(player)

        self._display = DisplayConsole()
        self._input = InputConsole()
        self._current_column = 0

    def play_turn(self) -> int:
        self._current_column = 0

        # draws token
        self._display.draw_token(self._current_column, -1, self._player)

        while True:
            key = self._input.read_key()
            
            if key == Keys.LEFT and self._current_column > 0:
                # clears position
                self._display.draw_token(self._current_column, -1, GameToken.EMPTY)
                self._current_column -= 1
                # draws at now position
                self._display.draw_token(self._current_column, -1, self._player)
            
            elif key == Keys.RIGHT and self._current_column < 6:
                # clears position
                self._display.draw_token(self._current_column, -1, GameToken.EMPTY)
                self._current_column += 1
                # draws at now position
                self._display.draw_token(self._current_column, -1, self._player)
            
            elif key == Keys.ENTER:
                # clears top token
                self._display.draw_token(self._current_column, -1, GameToken.EMPTY)
                return self._current_column
            
            # emergency exit
            elif key == Keys.ESC:
                raise KeyboardInterrupt()

    def draw_board(self, board: list, state: GameState):
        self._display.draw_grid() # draws the grid
        
        # draws tokens
        for y in range(6):
            for x in range(7):
                if board[y][x] != ' ':
                    self._display.draw_token(x, y, board[y][x])

if __name__ == '__main__':

    board = [[' ' for _ in range(7)] for _ in range(6)]
    board[5][0] = GameToken.RED  # [Y][X]
    p = PlayerConsole(GameToken.YELLOW)

    Ansi.clear_screen()
    Ansi.reset()
    p.draw_board(board, GameState.TURN_YELLOW)
    pos = p.play_turn()
    Ansi.reset()
    Ansi.gotoXY(1, 20)
    print(f"Position: {pos}")