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

import random
import pygame
import os

import classes.extras as ex
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.lvlc = mainloop.xml_conn.get_level_count(mainloop.m.game_dbid, mainloop.config.user_age_group)
        self.level = lc.Level(self, mainloop, self.lvlc[0], self.lvlc[1])
        gd.BoardGame.__init__(self, mainloop, speaker, config, screen_w, screen_h, 11, 6)

    def create_game_objects(self, level=1):
        self.board.draw_grid = False
        self.vis_buttons = [0, 1, 1, 1, 1, 0, 1, 1, 1]
        self.mainloop.info.hide_buttonsa(self.vis_buttons)
        h = random.randrange(0, 255, 5)

        data = [11, 3]
        data.extend(self.mainloop.xml_conn.get_level_data(self.mainloop.m.game_dbid, self.mainloop.config.user_age_group, self.level.lvl))
        self.chapters = self.mainloop.xml_conn.get_chapters(self.mainloop.m.game_dbid, self.mainloop.config.user_age_group)

        self.data = data
        self.board.set_animation_constraints(0, data[0], 0, data[1])
        self.layout.update_layout(data[0], data[1])
        self.board.level_start(data[0], data[1], self.layout.scale)

        self.unit_mouse_over = None
        self.units = []

        if self.mainloop.m.game_variant == 0:
            if self.lang.ltr_text:
                self.alphabet = self.lang.alphabet_lc
            else:
                ts = "".join(self.lang.alphabet_lc)
                ts = ex.unival(ts)
                self.alphabet = ts[::-1]
        elif self.mainloop.m.game_variant == 1:
            self.alphabet = self.lang.alphabet_uc

        self.alph_len = len(self.alphabet)

        self.num_list = []
        self.indexes = []
        self.choice_indexes = [x for x in range(self.alph_len)]

        self.positionsd = {}

        if data[3]:
            choice_list = [x for x in range(self.alph_len - data[2])]
            index = random.randrange(0, len(choice_list))
            for i in range(data[2]):
                self.num_list.append(choice_list[index] + i)
                self.indexes.append(index + i)
                self.positionsd[index + i] = i
        else:
            choice_list = [x for x in range(self.alph_len)]
            for i in range(data[2]):
                index = random.randrange(0, len(choice_list))
                self.num_list.append(choice_list[index])
                self.indexes.append(choice_list[index])
                del (choice_list[index])

        self.indexes.sort()

        shuffled = self.num_list[:]
        random.shuffle(shuffled)

        # create table to store 'binary' solution
        self.solution_grid = [0 for x in range(data[0])]

        # find position of first door square
        x = (data[0] - data[2]) // 2

        self.positions = []
        for i in range(data[2]):
            self.positionsd[self.indexes[i]] = i
            self.positions.append([x + i, 0])

        if self.mainloop.scheme is None:
            dc_img_src = os.path.join('unit_bg', "universal_sq_dc.png")
        else:
            dc_img_src = None

        bg_img_src = os.path.join('unit_bg', "universal_sq_bg.png")

        number_color = ex.hsv_to_rgb(h, self.mainloop.cl.bg_color_s, self.mainloop.cl.bg_color_v)
        font_color = [ex.hsv_to_rgb(h, self.mainloop.cl.font_color_s, self.mainloop.cl.font_color_v), ]
        fg_number_color = ex.hsv_to_rgb(h, self.mainloop.cl.fg_hover_s, self.mainloop.cl.fg_hover_v)

        if self.mainloop.scheme is not None and self.mainloop.scheme.dark:
            bg_door_img_src = os.path.join('unit_bg', "universal_sq_door_no_trans.png")
        else:
            bg_door_img_src = os.path.join('unit_bg', "universal_sq_door.png")

        # add objects to the board
        for i in range(data[2]):
            # add new door
            self.board.add_universal_unit(grid_x=x+i, grid_y=0, grid_w=1, grid_h=1, txt=None,
                                          fg_img_src=None,
                                          bg_img_src=bg_door_img_src,
                                          dc_img_src=None,
                                          bg_color=(0, 0, 0, 0),
                                          border_color=None, font_color=None,
                                          bg_tint_color=number_color,
                                          fg_tint_color=None,
                                          txt_align=(0, 0), font_type=10, multi_color=False, alpha=True,
                                          immobilized=True, mode=2)
            y = random.randrange(1, data[1])
            caption = self.alphabet[shuffled[i]]
            self.board.add_universal_unit(grid_x=x+i, grid_y=y, grid_w=1, grid_h=1, txt=caption,
                                          fg_img_src=bg_img_src,
                                          bg_img_src=bg_img_src,
                                          dc_img_src=dc_img_src,
                                          bg_color=(0, 0, 0, 0),
                                          border_color=None, font_color=font_color,
                                          bg_tint_color=number_color,
                                          fg_tint_color=fg_number_color,
                                          txt_align=(0, 0), font_type=data[4], multi_color=False, alpha=True,
                                          immobilized=False, fg_as_hover=True)
            self.units.append(self.board.ships[-1])
            self.board.ships[i].checkable = True
            self.board.ships[i].init_check_images()
            self.board.ships[i].home_location = [x + self.positionsd[shuffled[i]], 0]
            self.solution_grid[x + i] = 1

        for each in self.board.units:
            self.board.all_sprites_list.move_to_front(each)

        self.outline_all(0, 1)

    def show_info_dialog(self):
        self.mainloop.dialog.show_dialog(3, self.d["Re-arrange alphabetical"])

    def handle(self, event):
        gd.BoardGame.handle(self, event)
        if event.type == pygame.MOUSEBUTTONUP:
            for each in self.board.units:
                if each.is_door is True:
                    self.board.all_sprites_list.move_to_front(each)
                self.auto_check()
            self.check_result()

        if event.type == pygame.MOUSEMOTION or event.type == pygame.MOUSEBUTTONUP:
            self.default_hover(event)

    def auto_check(self):
        for each in self.board.ships:
            each.update_me = True
            if each.checkable and (each.grid_y == 0):
                if each.home_location[0] == each.grid_x and each.home_location[1] == each.grid_y:
                    each.set_display_check(True)
                else:
                    each.set_display_check(False)
            else:
                each.set_display_check(None)

    def auto_check_reset(self):
        for each in self.board.ships:
            each.update_me = True
            each.set_display_check(None)

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

    def check_result(self):
        if self.board.grid[0] == self.solution_grid:
            ships = []

            # collect value and x position on the grid from ships list
            for i in range(self.data[2]):
                ships.append([self.board.ships[i].grid_x, self.board.ships[i].value])
            ships_sorted = sorted(ships)
            correct = True
            for i in range(self.data[2]):
                if i < self.data[2] - 1:
                    if ships_sorted[i][1] != ex.unival(self.alphabet[self.indexes[i]]):
                        correct = False
            if correct:
                self.auto_check()
                self.level.next_board()
            else:
                self.auto_check()
        else:
            self.auto_check_reset()