import os
import shutil
import tkinter as tk
from tkinter import messagebox, ttk, filedialog
from datetime import datetime
import threading

def actualizar_progreso():
    for i in range(1, 101, 5):  # Incremento gradual de la barra de progreso
        progress_var.set(i)
        root.update_idletasks()
        root.after(100)  # Esperar 100 ms para simular progreso

# Creado por Walter Paterno
# Variables para almacenar las carpetas de origen y destino
carpeta_origen = os.path.expanduser('~/.config/calibre')
carpeta_destino = os.path.join(os.path.expanduser('~'), 'Desktop')

def seleccionar_carpeta_origen():
    global carpeta_origen
    carpeta_seleccionada = filedialog.askdirectory()
    if carpeta_seleccionada:
        carpeta_origen = carpeta_seleccionada
        label_carpeta_origen.config(text=f"Source folder:\n{carpeta_origen}")

def seleccionar_carpeta_destino():
    global carpeta_destino
    carpeta_seleccionada = filedialog.askdirectory()
    if carpeta_seleccionada:
        carpeta_destino = carpeta_seleccionada
        label_carpeta_destino.config(text=f"Destination folder:\n{carpeta_destino}")

def hacer_backup():
    global carpeta_origen, carpeta_destino
    fecha_hora = datetime.now().strftime('%Y-%m-%d_%H-%M-%S')
    archivo_zip = f'calibre_backup_{fecha_hora}'
    destino = os.path.join(carpeta_destino, archivo_zip)
    
    if not os.path.exists(carpeta_origen):
        messagebox.showerror("Error", "The selected folder was not found")
        return
    
    def proceso_backup():
        try:
            actualizar_progreso()
            shutil.make_archive(destino, 'zip', carpeta_origen)
            progress_var.set(100)
            root.update_idletasks()
            messagebox.showinfo("Éxito", f"Backup created in: {destino}.zip")
        except Exception as e:
            messagebox.showerror("Error", f"Failed to create backup:\n{str(e)}")
    
    threading.Thread(target=proceso_backup, daemon=True).start()

# Crear interfaz gráfica
root = tk.Tk()
root.title("calibre Backup")
root.geometry("400x300")

label = tk.Label(root, text="Create backup of a folder", font=("Arial", 12))
label.pack(pady=10)

btn_seleccionar_origen = tk.Button(root, text="Select Source Folder", command=seleccionar_carpeta_origen, font=("Arial", 10))
btn_seleccionar_origen.pack(pady=5)

label_carpeta_origen = tk.Label(root, text=f"Source Folder:\n{carpeta_origen}", wraplength=350, font=("Arial", 10))
label_carpeta_origen.pack(pady=5)

btn_seleccionar_destino = tk.Button(root, text="Select Destination Folder", command=seleccionar_carpeta_destino, font=("Arial", 10))
btn_seleccionar_destino.pack(pady=5)

label_carpeta_destino = tk.Label(root, text=f"Destination Folder:\n{carpeta_destino}", wraplength=350, font=("Arial", 10))
label_carpeta_destino.pack(pady=5)

btn_backup = tk.Button(root, text="Make Backup", command=hacer_backup, font=("Arial", 10))
btn_backup.pack(pady=10)

progress_var = tk.DoubleVar()
progress_bar = ttk.Progressbar(root, variable=progress_var, maximum=100, length=300)
progress_bar.pack(pady=10)

btn_salir = tk.Button(root, text="Close", command=root.quit, font=("Arial", 10))
btn_salir.pack(pady=10)

root.mainloop()

