class CadastroLeitora:
    def __init__(self, master):

        self.this = Toplevel(master)
        self.this.title("Cadastro")
        self.this.resizable(False, False)

        w = self.this.winfo_screenwidth()
        h = self.this.winfo_screenheight()

        x = (w - self.this.winfo_reqwidth()) / 2
        y = (h - self.this.winfo_reqheight()) / 2

        self.this.geometry("+%d+%d" % (x - 150, y - 150))

        self.app = Application()

        self.leitoras_cadastradas = []

    def build_window(self):
        """

        :return:
        """

        main_frame = Frame(self.this)
        main_frame.pack()

        lbl_nome = Label(main_frame, text="Nome para leitora:")
        lbl_nome.grid(row=2, column=0, columnspan=2, sticky='w')

        self.leitora = Entry(main_frame, width=15)
        self.leitora.grid(row=2,
                          column=2,
                          columnspan=2,
                          padx=10,
                          pady=5,
                          sticky='w')

        lbl_ip = Label(main_frame, text="Ip de acesso:")
        lbl_ip.grid(row=3, column=0, columnspan=2, sticky='w')

        self.ip = Entry(main_frame, width=20)
        self.ip.grid(row=3,
                     column=2,
                     columnspan=2,
                     padx=10,
                     pady=5,
                     sticky='w')

        lbl_porta = Label(main_frame, text="Porta:")
        lbl_porta.grid(row=4, column=0, columnspan=2, sticky='w')

        self.porta = Entry(main_frame, width=10)
        self.porta.grid(row=4,
                        column=2,
                        columnspan=2,
                        padx=10,
                        pady=5,
                        sticky='w')

        lbl_antenas = Label(main_frame, text="Nº Antenas:")
        lbl_antenas.grid(row=5, column=0, columnspan=2, sticky='w')

        self.antenas = Spinbox(main_frame, width=3, from_=1, to=4)
        self.antenas.grid(row=5,
                          column=2,
                          columnspan=2,
                          padx=10,
                          pady=5,
                          sticky='w')
        self.antenas.config(state='readonly')

        bt_cadastrar = Button(main_frame,
                              width=10,
                              text="Cadastrar",
                              command=self.cadastar_leitora)
        bt_cadastrar.grid(row=10, column=0, padx=10, pady=10, sticky='w')

        bt_limpar = Button(main_frame,
                           width=10,
                           text="Limpar",
                           command=self.clear_entries())
        bt_limpar.grid(row=10, column=2, padx=10, pady=10, sticky='e')

        bt_cancelar = Button(main_frame,
                             width=10,
                             text="Cancelar",
                             command=self.close_window)
        bt_cancelar.grid(row=10, column=4, padx=10, pady=10, sticky='e')

        self.tabela_leitoras = ttk.Treeview(main_frame,
                                            selectmode="browse",
                                            show='headings')

        ttk.Style().configure("Treeview", width=50)

        self.tabela_leitoras['columns'] = '1', '2', '3', '4'

        self.tabela_leitoras.column('#1', width='100')
        self.tabela_leitoras.heading('#1', text='Nome')

        self.tabela_leitoras.column('#2', width='200')
        self.tabela_leitoras.heading('#2', text='IP')

        self.tabela_leitoras.column('#3', width='100')
        self.tabela_leitoras.heading('#3', text='Porta')

        self.tabela_leitoras.column('#4', width='100')
        self.tabela_leitoras.heading('#4', text='Nº Antenas')

        self.tabela_leitoras.grid(row=6,
                                  column=0,
                                  columnspan=5,
                                  padx=5,
                                  pady=10)

        self.tabela_leitoras.bind('<Double-Button-1>', self.load_da_tabela)

        scroll_bar_tree_vertical = Scrollbar(main_frame, relief='flat')
        scroll_bar_tree_vertical.grid(row=6,
                                      column=6,
                                      sticky=('w', 'e', 'n', 's'))

        self.tabela_leitoras.config(
            yscrollcommand=scroll_bar_tree_vertical.set)
        scroll_bar_tree_vertical.config(command=self.tabela_leitoras.yview)

        self.popular_tabela()

    def cadastar_leitora(self):

        if len(self.leitora.get()) == 0 or len(self.ip.get()) == 0 or len(
                self.porta.get()) == 0:
            messagebox.showwarning(
                "Erro",
                "Antes, preencha todos os campos corretamente",
                parent=self.this)
            return

        nome = self.leitora.get()
        ip = self.ip.get()
        porta = self.porta.get()
        antenas = self.antenas.get()

        try:
            self.app.registrar_leitora(nome, ip, porta, antenas)

        except:

            op = messagebox.askyesno(
                "Erro",
                "Essa leitora já possui um registro, deseja atualizar?",
                parent=self.this)

            if op is True:
                self.app.atualizar_leitora(nome, ip, porta, antenas)
            else:
                self.clear_entries()
                return

        self.app.conf_antenas(ip, porta, int(antenas))
        messagebox.showinfo("Cadastro",
                            "Cadastro realizado com sucesso!",
                            parent=self.this)

        self.popular_tabela()

        self.clear_entries()

    def popular_tabela(self):
        """

        :return:
        """

        if len(self.tabela_leitoras.get_children()) > 0:
            self.tabela_leitoras.delete(*self.tabela_leitoras.get_children())

        self.leitoras_cadastradas = self.app.get_leitoras_registradas()

        row = 1
        for registro in self.leitoras_cadastradas:

            self.tabela_leitoras.insert(
                "",
                row,
                iid=int(row),
                values=[registro[0], registro[1], registro[2], registro[3]])

            row += 1

    def load_da_tabela(self, event):
        """

        :param event:
        :return:
        """

        print(self.tabela_leitoras.selection())
        index = int(self.tabela_leitoras.selection()[0]) - 1

        carro = self.leitoras_cadastradas[index]

        self.leitora.delete(0, END)
        self.leitora.insert(0, carro[0])

        self.ip.delete(0, END)
        self.ip.insert(0, carro[1])

        self.porta.delete(0, END)
        self.porta.insert(0, carro[2])

    def clear_entries(self):
        """

        :return:
        """

        self.leitora.delete(0, END)
        self.ip.delete(0, END)
        self.porta.delete(0, END)

    def open_window(self):
        self.build_window()
        self.this.mainloop()

    def close_window(self):
        self.this.destroy()