from PyQt5 import QtWidgets, QtCore, QtGui
from util import color_name

GREEN = QtGui.QColor(51, 204, 51)
BLACK = QtGui.QColor(0, 0, 0)
WHITE = QtGui.QColor(255, 255, 255)

# frequency (ms) to poll the SocketReceiver for new board state
POLL_QUEUE_INTERVAL = 0.25 * 1000


class ReversiWindow(QtWidgets.QWidget):

    def __init__(self, socket_receiver):
        super(ReversiWindow, self).__init__()
        self.socket_receiver = socket_receiver
        self.setAutoFillBackground(True)
        self.setMinimumSize(320, 240)
        self.board = None

        # timer for repainting/polling network
        timer = QtCore.QTimer(self)
        timer.timeout.connect(self.poll_msg_queue)
        timer.start(POLL_QUEUE_INTERVAL)

    def poll_msg_queue(self):
        self.board = self.socket_receiver.get_board()
        self.repaint()

        winner = self.socket_receiver.get_winner()
        if winner is not None:
            dialog = QtWidgets.QMessageBox()
            dialog.setText('{} wins.'.format(winner))
            dialog.exec_()

        player_with_no_moves = self.socket_receiver.get_no_moves()
        if player_with_no_moves is not None:
            name = color_name[player_with_no_moves]
            dialog = QtWidgets.QMessageBox()
            dialog.setText('{} had no moves, skipping turn.'.format(name))
            dialog.exec_()

    def resizeEvent(self, resize_event):
        new_size = resize_event.size()
        new_height = new_size.height()
        new_width = int(new_height * 1)  # change ratio how you like
        self.resize(new_width, new_height)

    def mousePressEvent(self, mouse_event):
        grid_x, grid_y = self.pixels_to_grid(mouse_event.x(), mouse_event.y())
        self.socket_receiver.send_move((grid_x, grid_y))

    def paintEvent(self, q_paint_event):
        # board background color
        painter = QtGui.QPainter(self)
        bg_path = QtGui.QPainterPath()
        bg_path.addRect(0, 0, self.width(), self.height())
        painter.fillPath(bg_path, GREEN)

        # draw the board lines
        for i in range(8):
            x_pos = self.width() / 8 * i
            painter.drawLine(x_pos, 0, x_pos, self.height())

            y_pos = self.height() / 8 * i
            painter.drawLine(0, y_pos, self.width(), y_pos)

        if self.board is not None and len(self.board) >= 8 * 8:
            for h in range(8):
                for w in range(8):
                    pieces_path = QtGui.QPainterPath()
                    w_dist = self.width() / 8
                    h_dist = self.height() / 8

                    x_pos = w_dist * w
                    y_pos = h_dist * h

                    bounding_rect = QtCore.QRectF(x_pos, y_pos, w_dist, h_dist)

                    index = (h * 8) + w
                    piece = self.board[index]
                    if piece == 'O':
                        pieces_path.addEllipse(bounding_rect)
                        painter.fillPath(pieces_path, WHITE)
                    elif piece == 'X':
                        pieces_path.addEllipse(bounding_rect)
                        painter.fillPath(pieces_path, BLACK)

    def pixels_to_grid(self, pix_x, pix_y):
        grid_width = self.width() / 8
        grid_height = self.height() / 8

        return int(pix_x / grid_width), int(8 - (pix_y / grid_height))