import tkinter

from extra_widgets import MyButton
# from extra_tools import get_line_points

from edit_frame_grid import GridFrame, GridLeftToolsFrame, GridRightToolsFrame
from pacworms_global import CONST, VAR

class WallsFrame(tkinter.Frame):

    def __init__(self, parent):
        """
        :param parent:
        """
        tkinter.Frame.__init__(self, parent)
        # self.parent = parent
        self.configure(background=CONST.WidgetsColor.frame_grid_buttons)

        #
        #   centrer la grille -> GRID(0, 0)
        #
        self.columnconfigure(0, weight=1)
        self.rowconfigure(1, weight=1)

        #
        #   init. variables
        #
        # self.mouse_left_right_pressed = False
        # self.walls_state_value = 0

        #
        #   frames bars left and right -> GRID(0, 0)
        #
        frames_bar_left = tkinter.Frame(self, background=CONST.WidgetsColor.frame_grid_buttons)

        frames_bar_left.grid(column=0, row=0, padx=0, pady=2, sticky="nsw")

        #
        #   lefts buttons
        #
        self.button_point = MyButton(frames_bar_left, "ICON_POINT")
        self.button_line = MyButton(frames_bar_left, "ICON_LINE")
        self.button_rectangle = MyButton(frames_bar_left, "ICON_RECTANGLE")
        self.button_filled_rectangle = MyButton(frames_bar_left, "ICON_FILLED_RECTANGLE")
        self.button_circle = MyButton(frames_bar_left, "ICON_CIRCLE")
        self.button_filled_circle = MyButton(frames_bar_left, "ICON_FILLED_CIRCLE")

        self.button_point.config(command=lambda: self.action_button_point())
        self.button_line.config(command=lambda: self.action_button_line())
        self.button_rectangle.config(command=lambda: self.action_button_rectangle())
        self.button_filled_rectangle.config(command=lambda: self.action_button_filled_rectangle())
        self.button_circle.config(command=lambda: self.action_button_circle())
        self.button_filled_circle.config(command=lambda: self.action_button_filled_circle())

        self.button_point.grid(column=0, row=0, padx=2, pady=1)
        self.button_line.grid(column=1, row=0, padx=2, pady=1)
        self.button_rectangle.grid(column=2, row=0, padx=2, pady=1)
        self.button_filled_rectangle.grid(column=3, row=0, padx=2, pady=1)
        self.button_circle.grid(column=4, row=0, padx=2, pady=1)
        self.button_filled_circle.grid(column=5, row=0, padx=2, pady=1)

        #
        #   right buttons
        #
        # ...

        #
        #   frames grid -> GRID(0, 1)
        #

        # create GridFrame with Walls
        self.obj_grid_frame = GridFrame(self, VAR.levels.walls)
        self.obj_grid_frame.grid(column=0, row=1)

        #
        #   frames bar left and right -> GRID(0, 2)
        #
        obj_grid_left_tools_frame = GridLeftToolsFrame(self)
        obj_grid_right_tools_frame = GridRightToolsFrame(self, self.obj_grid_frame)

        obj_grid_left_tools_frame.grid(column=0, row=2, sticky="nsw")
        obj_grid_right_tools_frame.grid(column=0, row=2, sticky="nse")

        #
        #   canvas mouses actions
        #
        self.canvas = self.obj_grid_frame.get_canvas()
        self.canvas.bind('<Button-1>', self.mouse_left_click)
        self.canvas.bind("<B1-Motion>", self.mouse_left_motion)
        self.canvas.bind('<ButtonRelease-1>', self.mouse_left_release)

        # self.canvas.bind('<Button-3>', lambda event, arg1=0: self.mouse_left_right_click(event, arg1))
        # self.canvas.bind('<ButtonRelease-3>', self.mouse_left_right_release)

        #
        #   par defaut point button
        #
        self.action_button_point()

    def buttons_init(self):
        """
        :return:
        """

        self.button_point.set_state(0)
        self.button_line.set_state(0)
        self.button_rectangle.set_state(0)
        self.button_filled_rectangle.set_state(0)
        self.button_circle.set_state(0)
        self.button_filled_circle.set_state(0)

    def action_button_point(self):
        """
        :return:
        """

        self.buttons_init()
        self.button_point.set_state(1)

    def action_button_line(self):
        """
        :return:
        """

        self.buttons_init()
        self.button_line.set_state(1)

    def action_button_rectangle(self):
        """
        :return:
        """

        self.buttons_init()
        self.button_rectangle.set_state(1)

    def action_button_filled_rectangle(self):
        """
        :return:
        """

        self.buttons_init()
        self.button_filled_rectangle.set_state(1)

    def action_button_circle(self):
        """
        :return:
        """

        self.buttons_init()
        self.button_circle.set_state(1)

    def action_button_filled_circle(self):
        """
        :return:
        """

        self.buttons_init()
        self.button_filled_circle.set_state(1)

    def mouse_left_click(self, event):
        """
        - récuperer les coordonnées du clic gauche de la souris, colonne et ligne
        - 2 règles : les coordonnées colonne et ligne sont dans la grille et la case est vide
        - si ok : on affiche un point et on marque la case
        :param event:
        :return:
        """

        column, line = self.obj_grid_frame.get_grid_position(event.x, event.y)

        if self.obj_grid_frame.test_mouse_coords(column, line):

            if VAR.levels.walls.get_foreground(column, line) == 0:

                self.obj_grid_frame.draw_box_full(column, line, CONST.EditGridElements.walls_color_fg)
                VAR.levels.walls.set_foreground(CONST.EditGridElements.walls_value, column, line)

    def mouse_left_motion(self, event):
        """
        - afficher les coordonnées de la souris
        - récuperer les coordonnées du clic gauche de la souris, colonne et ligne
        - 2 règles : les coordonnées colonne et ligne sont dans la grille et la case est vide
        - si ok : on affiche un point et on marque la case
        :param event:
        :return:
        """

        self.obj_grid_frame.show_mouse_coords(event)

        column, line = self.obj_grid_frame.get_grid_position(event.x, event.y)

        if self.obj_grid_frame.test_mouse_coords(column, line):

            if VAR.levels.walls.get_foreground(column, line) == 0:

                self.obj_grid_frame.draw_box_full(column, line, CONST.EditGridElements.walls_color_fg)
                VAR.levels.walls.set_foreground(CONST.EditGridElements.walls_value, column, line)

    def mouse_left_release(self, event):
        """
        :param event:
        :return:
        """

        pass