# gui.py
# Interface gráfica da aplicação UNIQ usando tkinter

import tkinter as tk
from tkinter import filedialog, messagebox
from tkinter.ttk import Progressbar
from pathlib import Path
import threading

from modules.logger import logger
from modules.copier import copiar_ficheiros_para_destino
from modules.scanner import listar_ficheiros, listar_ficheiros_unicos


class UniqGUI:
    def __init__(self, master):
        self.master = master
        self.master.title("Uniq - Cópia de Ficheiros")
        self.master.geometry("600x300")

        self.origem = tk.StringVar()
        self.destino = tk.StringVar()
        self.categorizar_data = tk.BooleanVar()
        self.usar_criacao = tk.BooleanVar()
        self.remover_duplicados = tk.BooleanVar()

        self._construir_interface()

    def _construir_interface(self):
        # Selecção de origem
        tk.Label(self.master, text="Pasta de Origem:").grid(
            row=0, column=0, sticky="e")
        tk.Entry(self.master, textvariable=self.origem,
                 width=40).grid(row=0, column=1)
        tk.Button(self.master, text="Procurar", command=self._selecionar_origem).grid(
            row=0, column=2
        )

        # Selecção de destino
        tk.Label(self.master, text="Pasta de Destino:").grid(
            row=1, column=0, sticky="e"
        )
        tk.Entry(self.master, textvariable=self.destino,
                 width=40).grid(row=1, column=1)
        tk.Button(self.master, text="Procurar", command=self._selecionar_destino).grid(
            row=1, column=2
        )

        # Opções
        tk.Checkbutton(
            self.master, text="Categorizar por data", variable=self.categorizar_data
        ).grid(row=2, column=1, sticky="w")
        tk.Checkbutton(
            self.master, text="Usar data de criação", variable=self.usar_criacao
        ).grid(row=3, column=1, sticky="w")
        tk.Checkbutton(
            self.master,
            text="Remover ficheiros duplicados",
            variable=self.remover_duplicados,
        ).grid(row=4, column=1, sticky="w")

        # Botão de início
        tk.Button(
            self.master, text="Iniciar cópia", command=self._iniciar_copia_thread
        ).grid(row=5, column=1, pady=10)

        # Barra de progresso
        self.progress = Progressbar(self.master, mode="determinate")
        self.progress.grid(row=6, column=0, columnspan=3,
                           sticky="ew", padx=10, pady=10)

    def _selecionar_origem(self):
        pasta = filedialog.askdirectory()
        if pasta:
            self.origem.set(pasta)

    def _selecionar_destino(self):
        pasta = filedialog.askdirectory()
        if pasta:
            self.destino.set(pasta)

    def _iniciar_copia_thread(self):
        thread = threading.Thread(target=self._iniciar_copia)
        thread.start()

    def _iniciar_copia(self):
        origem = self.origem.get()
        destino = self.destino.get()

        if not origem or not destino:
            messagebox.showerror("Erro", "Origem e destino são obrigatórios.")
            return

        if self.remover_duplicados.get():
            ficheiros_dict = listar_ficheiros_unicos(origem)
            lista_ficheiros = [ficheiro[0]
                               for ficheiro in ficheiros_dict.values()]
        else:
            lista_ficheiros = listar_ficheiros(origem)

        total = len(lista_ficheiros)
        self.progress["maximum"] = total

        logger.info("lista de ficheiros com %d entradas", total)

        def callback():
            self.progress["value"] += 1

        def progresso_callback():
            self.master.after(0, callback)

        copiar_ficheiros_para_destino(
            lista_ficheiros,
            destino,
            categorizar_data=self.categorizar_data.get(),
            usar_criacao=self.usar_criacao.get(),
            progresso_callback=progresso_callback,
        )

        self.master.after(
            0,
            lambda: messagebox.showinfo(
                "Concluído", f"Foram copiados {total} ficheiros."
            ),
        )


if __name__ == "__main__":
    root = tk.Tk()
    app = UniqGUI(root)
    root.mainloop()
