# -*- coding: utf-8 -*-

import pygame
import random

import classes.board
import classes.game_driver as gd
import classes.level_controller as lc


class Board(gd.BoardGame):
    def __init__(self, mainloop, speaker, config, screen_w, screen_h):
        self.level = lc.Level(self, mainloop, 10, 4)
        gd.BoardGame.__init__(self, mainloop, speaker, config, screen_w, screen_h, 5, 3)

    def create_game_objects(self, level=1):
        self.board.decolorable = False
        self.board.draw_grid = False
        self.font_col = (0, 0, 0)
        if self.mainloop.scheme is not None:
            if self.level.lvl > 1:
                self.font_col = self.mainloop.scheme.u_font_color

        if self.level.lvl == 1:
            choice = [x for x in range(0, 20)]
            self.color_choice = [self.d["white"], self.d["black"], self.d["grey"], self.d["red"], self.d["orange"],
                                 self.d["yellow"], self.d["olive"], self.d["green"], self.d["sea green"],
                                 self.d["teal"], self.d["blue"], self.d["navy"], self.d["purple"], self.d["magenta"],
                                 self.d["indigo"], self.d["pink"], self.d["maroon"], self.d["brown"], self.d["aqua"],
                                 self.d["lime"]]
            self.color_choicep = [self.dp["white"], self.dp["black"], self.dp["grey"], self.dp["red"],
                                  self.dp["orange"], self.dp["yellow"], self.dp["olive"], self.dp["green"],
                                  self.dp["sea green"], self.dp["teal"], self.dp["blue"], self.dp["navy"],
                                  self.dp["purple"], self.dp["magenta"], self.dp["indigo"], self.dp["pink"],
                                  self.dp["maroon"], self.dp["brown"], self.dp["aqua"], self.dp["lime"]]
            # self.color_choice= ["white",    "black",      "grey",       "red",     "orange",  "yellow",   "olive",    "green",  "sea green","teal",     "blue",   "navy",   "purple",    "magenta",  "indigo",  "pink"       "maroon",  "brown",     "aqua",      "lime" ]
            self.hue_choice = [[255, 255, 255, 255], [0, 0, 0, 255], [140, 140, 140], [255, 0, 0], [255, 138, 0], [255, 255, 0],
                               [181, 219, 3], [0, 160, 0], [41, 131, 82], [0, 130, 133], [0, 0, 255], [0, 0, 132],
                               [132, 0, 132], [255, 0, 255], [74, 0, 132], [255, 20, 138], [132, 0, 0], [140, 69, 16],
                               [0, 255, 255], [0, 255, 0]]
            self.hue_choice2 = [[150, 150, 150], [100, 100, 100], [100, 100, 100], [200, 0, 0], [200, 80, 0],
                                [200, 200, 0], [121, 159, 3], [0, 100, 0], [31, 100, 52], [0, 90, 90], [0, 0, 200],
                                [0, 0, 82], [92, 0, 92], [200, 0, 200], [44, 0, 82], [200, 10, 88], [100, 0, 0],
                                [100, 39, 6], [0, 200, 200], [0, 200, 0]]
            self.font_color = [[0, 0, 0], [225, 225, 225], [0, 0, 0], [100, 0, 0], [100, 40, 0], [100, 100, 0],
                               [60, 80, 3], [0, 50, 0], [11, 50, 22], [0, 40, 40], [0, 0, 100], [0, 0, 255],
                               [255, 0, 255], [100, 0, 100], [140, 0, 255], [100, 5, 48], [200, 50, 50], [200, 100, 26],
                               [0, 155, 155], [0, 155, 0]]
            self.init_font_color = [[230, 230, 230], [2, 2, 2], [140, 140, 140], [255, 0, 0], [255, 138, 0],
                                    [255, 255, 0], [181, 219, 3], [0, 160, 0], [41, 131, 82], [0, 130, 133],
                                    [0, 0, 255], [0, 0, 132], [132, 0, 132], [255, 0, 255], [74, 0, 132],
                                    [255, 20, 138], [132, 0, 0], [140, 69, 16], [0, 255, 255], [0, 255, 0]]
        elif self.level.lvl == 2:
            choice = [x for x in range(0, 13)]
            self.color_choice = [self.d["white"], self.d["black"], self.d["grey"], self.d["red"], self.d["orange"],
                                 self.d["yellow"], self.d["olive"], self.d["green"], self.d["blue"], self.d["navy"],
                                 self.d["purple"], self.d["pink"], self.d["brown"]]
            self.color_choicep = [self.dp["white"], self.dp["black"], self.dp["grey"], self.dp["red"],
                                  self.dp["orange"], self.dp["yellow"], self.dp["olive"], self.dp["green"],
                                  self.dp["blue"], self.dp["navy"], self.dp["purple"], self.dp["pink"],
                                  self.dp["brown"]]
            # self.color_choice= ["white",    "black",      "grey",      "red",     "orange",   "yellow",   "olive",    "green",  "blue",    "navy",   "purple",   "pink"]
            self.hue_choice = [[255, 255, 255, 255], [0, 0, 0, 255], [140, 140, 140], [255, 0, 0], [255, 138, 0], [255, 255, 0],
                               [181, 219, 3], [0, 160, 0], [0, 0, 255], [0, 0, 132], [132, 0, 132], [255, 20, 138],
                               [140, 69, 16]]
            self.hue_choice2 = [[150, 150, 150], [100, 100, 100], [100, 100, 100], [200, 0, 0], [200, 80, 0],
                                [200, 200, 0], [121, 159, 3], [0, 100, 0], [0, 0, 200], [0, 0, 82], [92, 0, 92],
                                [200, 10, 88], [100, 39, 6]]
            self.font_color = [[0, 0, 0], [225, 225, 225], [0, 0, 0], [100, 0, 0], [100, 40, 0], [100, 100, 0],
                               [60, 80, 3], [0, 50, 0], [0, 0, 100], [0, 0, 255], [255, 0, 255], [100, 5, 48],
                               [200, 100, 26]]
            self.init_font_color = [self.font_col for i in range(13)]
        elif self.level.lvl >= 3:
            choice = [x for x in range(0, 20)]
            self.color_choice = [self.d["white"], self.d["black"], self.d["grey"], self.d["red"], self.d["orange"],
                                 self.d["yellow"], self.d["olive"], self.d["green"], self.d["sea green"],
                                 self.d["teal"], self.d["blue"], self.d["navy"], self.d["purple"], self.d["magenta"],
                                 self.d["indigo"], self.d["pink"], self.d["maroon"], self.d["brown"], self.d["aqua"],
                                 self.d["lime"]]
            self.color_choicep = [self.dp["white"], self.dp["black"], self.dp["grey"], self.dp["red"],
                                  self.dp["orange"], self.dp["yellow"], self.dp["olive"], self.dp["green"],
                                  self.dp["sea green"], self.dp["teal"], self.dp["blue"], self.dp["navy"],
                                  self.dp["purple"], self.dp["magenta"], self.dp["indigo"], self.dp["pink"],
                                  self.dp["maroon"], self.dp["brown"], self.dp["aqua"], self.dp["lime"]]
            # self.color_choice= ["white",    "black",      "grey",       "red",     "orange",  "yellow",   "olive",    "green",  "sea green","teal",     "blue",   "navy",   "purple",    "magenta",  "indigo",  "pink"       "maroon",  "brown",     "aqua",      "lime" ]
            self.hue_choice = [[255, 255, 255, 255], [0, 0, 0, 255], [140, 140, 140], [255, 0, 0], [255, 138, 0], [255, 255, 0],
                               [181, 219, 3], [0, 160, 0], [41, 131, 82], [0, 130, 133], [0, 0, 255], [0, 0, 132],
                               [132, 0, 132], [255, 0, 255], [74, 0, 132], [255, 20, 138], [132, 0, 0], [140, 69, 16],
                               [0, 255, 255], [0, 255, 0]]
            self.hue_choice2 = [[150, 150, 150], [100, 100, 100], [100, 100, 100], [200, 0, 0], [200, 80, 0],
                                [200, 200, 0], [121, 159, 3], [0, 100, 0], [31, 100, 52], [0, 90, 90], [0, 0, 200],
                                [0, 0, 82], [92, 0, 92], [200, 0, 200], [44, 0, 82], [200, 10, 88], [100, 0, 0],
                                [100, 39, 6], [0, 200, 200], [0, 200, 0]]
            self.font_color = [[0, 0, 0], [225, 225, 225], [0, 0, 0], [100, 0, 0], [100, 40, 0], [100, 100, 0],
                               [60, 80, 3], [0, 50, 0], [11, 50, 22], [0, 40, 40], [0, 0, 100], [0, 0, 255],
                               [255, 0, 255], [100, 0, 100], [140, 0, 255], [100, 5, 48], [200, 50, 50], [200, 100, 26],
                               [0, 155, 155], [0, 155, 0]]
            self.init_font_color = [self.font_col for i in range(20)]

        self.bg_col = (255, 255, 255, 0)
        if self.mainloop.scheme is not None:
            if self.mainloop.scheme.dark:
                self.bg_col = (0, 0, 0, 0)
                if self.level.lvl == 1:
                    self.init_font_color[1] = (30, 30, 30)

        data = [5, 3]

        if self.lang.lang in ["en_GB", "en_US"]:
            font_size = 10
        else:
            font_size = 11
        # stretch width to fit the screen size
        max_x_count = self.get_x_count(data[1], even=False)
        if max_x_count > 5:
            data[0] = max_x_count

        self.data = data
        self.center = self.data[0] // 2
        self.vis_buttons = [0, 1, 1, 1, 1, 0, 1, 0, 0]
        self.mainloop.info.hide_buttonsa(self.vis_buttons)

        self.layout.update_layout(data[0], data[1])
        scale = self.layout.scale
        self.board.level_start(data[0], data[1], scale)
        shuffled = choice[:]
        random.shuffle(shuffled)
        self.chosen = shuffled[0:5]

        self.shuffled2 = self.chosen[:]
        random.shuffle(self.shuffled2)
        x = self.center - 2
        self.color_pos_offset = x
        for i in range(5):
            self.board.add_door(x + i, 0, 1, 1, classes.board.Door, self.color_choice[self.chosen[i]], self.bg_col)
            self.board.add_unit(x + i, 2, 1, 1, classes.board.Letter, self.color_choice[self.shuffled2[i]], self.bg_col,
                                "", alpha=True, font_size=font_size)

            self.board.ships[-1].speaker_val = self.color_choicep[self.shuffled2[i]]
            self.board.ships[-1].speaker_val_update = False
            self.board.ships[-1].checkable = True
            self.board.ships[-1].init_check_images()
            font_color = self.init_font_color[self.shuffled2[i]]
            if self.level.lvl == 1:
                self.board.ships[i].font_color = font_color
            else:
                self.board.ships[i].font_color = self.font_col
            if self.level.lvl == 4:
                self.board.ships[i].readable = False

        for each in self.board.ships:
            self.board.all_sprites_list.move_to_front(each)
            each.highlight = False

        for each in self.board.units:
            each.outline = False
            each.show_value = False

        # splash polygon - unscalled - size 200x200
        lines = [[135, 128], [133, 132], [135, 137], [157, 157], [158, 161], [155, 165], [150, 166], [146, 163],
                 [133, 140], [129, 138], [125, 139], [122, 142], [122, 144], [128, 157], [128, 159], [126, 161],
                 [123, 161], [121, 160], [114, 147], [112, 145], [107, 145], [104, 148], [104, 154], [110, 179],
                 [111, 186], [110, 192], [105, 194], [100, 193], [98, 188], [98, 180], [101, 154], [100, 148],
                 [96, 146], [93, 147], [92, 149], [88, 163], [86, 165], [83, 165], [80, 164], [80, 161], [80, 158],
                 [83, 147], [82, 143], [73, 139], [65, 143], [55, 167], [52, 174], [48, 179], [42, 178], [37, 174],
                 [38, 169], [43, 163], [57, 151], [63, 144], [67, 137], [66, 129], [60, 126], [51, 138], [47, 141],
                 [44, 142], [40, 140], [38, 136], [40, 134], [44, 131], [57, 124], [56, 117], [51, 114], [43, 120],
                 [40, 122], [38, 124], [36, 124], [34, 122], [34, 119], [36, 117], [50, 111], [52, 108], [53, 102],
                 [51, 98], [46, 96], [38, 97], [11, 103], [5, 103], [3, 99], [4, 94], [10, 92], [36, 94], [44, 94],
                 [50, 91], [53, 87], [52, 83], [46, 81], [21, 79], [14, 78], [9, 76], [8, 73], [10, 71], [15, 71],
                 [22, 72], [45, 77], [51, 77], [53, 74], [52, 69], [40, 60], [39, 57], [39, 55], [41, 53], [44, 53],
                 [47, 54], [55, 59], [58, 59], [61, 58], [62, 55], [61, 52], [54, 43], [54, 41], [55, 38], [58, 37],
                 [61, 39], [71, 51], [74, 52], [80, 50], [81, 46], [80, 40], [77, 32], [66, 18], [62, 12], [61, 6],
                 [65, 3], [70, 2], [74, 6], [76, 13], [79, 30], [81, 37], [86, 42], [91, 43], [95, 41], [95, 39],
                 [93, 28], [93, 25], [93, 23], [96, 22], [99, 22], [100, 24], [100, 28], [99, 39], [101, 41], [103, 42],
                 [106, 42], [108, 40], [111, 29], [112, 26], [114, 25], [117, 24], [119, 26], [120, 29], [119, 33],
                 [116, 45], [117, 48], [119, 50], [122, 50], [135, 33], [137, 31], [140, 31], [142, 34], [142, 37],
                 [133, 53], [133, 56], [134, 59], [137, 59], [141, 56], [155, 40], [160, 36], [164, 35], [169, 38],
                 [170, 42], [168, 46], [163, 50], [146, 59], [144, 62], [145, 66], [149, 67], [160, 64], [162, 63],
                 [164, 64], [165, 66], [165, 69], [164, 71], [150, 77], [148, 79], [148, 84], [150, 88], [155, 89],
                 [173, 81], [179, 79], [183, 79], [185, 83], [186, 90], [184, 93], [180, 95], [175, 94], [158, 95],
                 [154, 99], [153, 103], [156, 106], [163, 108], [185, 113], [190, 115], [191, 118], [189, 122],
                 [184, 121], [163, 111], [156, 109], [151, 110], [147, 115], [145, 120], [146, 124], [151, 128],
                 [163, 135], [168, 139], [171, 142], [171, 146], [167, 146], [162, 144], [158, 140], [149, 132],
                 [144, 128], [140, 127]]
        size = self.board.units[0].grid_w * self.board.scale
        # new point = size * orig_point / 200
        self.scaled_lines = [[int(size * each[0] / 200.0), int(size * each[1] / 200.0)] for each in lines]
        for i in range(5):
            color1 = self.hue_choice[self.chosen[i]]
            color2 = self.hue_choice2[self.chosen[i]]
            canvas = pygame.Surface((size, size - 1), flags=pygame.SRCALPHA)
            canvas.fill(self.board.units[i].initcolor)
            self.draw_splash(canvas, size, color1, color2)
            self.board.units[i].painting = canvas.copy()

    def auto_check_reset(self):
        for each in self.board.ships:
            if each.checkable:
                each.set_display_check(None)

    def draw_splash(self, canvas, size, color, outline_color):
        pygame.draw.polygon(canvas, color, self.scaled_lines, 0)
        pygame.draw.lines(canvas, outline_color, True, self.scaled_lines)

    def handle(self, event):
        gd.BoardGame.handle(self, event)
        if event.type == pygame.KEYDOWN or event.type == pygame.MOUSEBUTTONDOWN:
            self.auto_check_reset()
        if event.type == pygame.MOUSEMOTION:
            if self.drag:
                self.swap_font_color()
        elif event.type == pygame.MOUSEBUTTONUP:
            self.swap_font_color()
            self.check_result()

    def after_keydown_move(self):
        # in case somebody uses keyboard to move the labels
        self.swap_font_color()

    def swap_font_color(self):
        active_ship = self.board.ships[self.board.active_ship]
        if active_ship.grid_y == 0 and self.color_pos_offset <= active_ship.grid_x < 5 + self.color_pos_offset:
            active_ship.font_color = self.font_color[self.chosen[active_ship.grid_x - self.color_pos_offset]]
        else:
            if self.level.lvl == 1:
                active_ship.font_color = self.init_font_color[self.shuffled2[self.board.active_ship]]
            else:
                active_ship.font_color = self.font_col
        active_ship.update_me = True

    def update(self, game):
        game.fill(self.bg_col)
        gd.BoardGame.update(self, game)

    def check_result(self):
        # checking copied from number sorting game and re-done
        match_found = False
        if self.board.grid[0][self.center - 2:self.center + 3] == [1, 1, 1, 1, 1]:
            ships = []
            units = []
            # collect value and x position on the grid from ships list
            for i in range(5):
                ships.append([self.board.ships[i].grid_x, self.board.ships[i].value, self.board.ships[i]])
                units.append([self.board.units[i].grid_x, self.board.units[i].value])
            ships.sort()
            units.sort()
            correct = True
            for i in range(5):
                if ships[i][1] != units[i][1]:
                    ships[i][2].set_display_check(False)
                    correct = False
                else:
                    ships[i][2].set_display_check(True)

            if correct:
                match_found = True
        if match_found:
            self.level.next_board()

        self.mainloop.redraw_needed[0] = True
