import sys
import os
import threading
import customtkinter as ctk

from tkinter import filedialog

from document.pipeline import process_document
from core.events import events
from core.logger import log


# ---------------- BASE REAL ----------------
if getattr(sys, 'frozen', False):

    # EXE compilado
    BASE_DIR = os.path.dirname(sys.executable)

else:

    # Python normal
    BASE_DIR = os.path.dirname(os.path.abspath(__file__))


# ---------------- PATHS ----------------
TEMP_DIR = os.path.join(BASE_DIR, "temp")
OUTPUT_DIR = os.path.join(BASE_DIR, "output")
LOG_DIR = os.path.join(BASE_DIR, "logs")

os.makedirs(TEMP_DIR, exist_ok=True)
os.makedirs(OUTPUT_DIR, exist_ok=True)
os.makedirs(LOG_DIR, exist_ok=True)


# ---------------- GUI CONFIG ----------------
ctk.set_appearance_mode("dark")

app = ctk.CTk()

app.geometry("900x600")

app.title("Document AI ULTRA PRO")


file_path = None


# ---------------- UI SAFE UPDATE ----------------
def update_ui(data):

    app.after(
        0,
        lambda: progress.set(data["progress"] / 100)
    )

    app.after(
        0,
        lambda: status_label.configure(text=data["msg"])
    )


events.subscribe(update_ui)


# ---------------- SELECT FILE ----------------
def select_file():

    global file_path

    file_path = filedialog.askopenfilename(
        filetypes=[("PDF", "*.pdf")]
    )

    file_label.configure(text=file_path)

    log(f"PDF seleccionado: {file_path}")


# ---------------- RUN PROCESS ----------------
def start():

    if not file_path:

        file_label.configure(text="Selecciona un PDF")
        return

    def worker():

        print("WORKER INICIADO")

        try:

            log("INICIO ULTRA PRO")

            print("ANTES PROCESS")

            process_document(
                file_path,
                TEMP_DIR,
                OUTPUT_DIR
            )

            print("PROCESS TERMINADO")

        except Exception as e:

            print("ERROR REAL:")
            print(e)

            import traceback
            traceback.print_exc()

            log(f"ERROR: {e}")

    threading.Thread(
        target=worker,
        daemon=True
    ).start()


# ---------------- CANCEL ----------------
def cancel():

    log("Cancelación solicitada")


# ---------------- UI ----------------
ctk.CTkLabel(
    app,
    text="DOCUMENT AI ULTRA PRO",
    font=("Arial", 28)
).pack(pady=20)


ctk.CTkButton(
    app,
    text="Seleccionar PDF",
    command=select_file
).pack(pady=10)


ctk.CTkButton(
    app,
    text="INICIAR",
    command=start
).pack(pady=10)


ctk.CTkButton(
    app,
    text="CANCELAR",
    command=cancel
).pack(pady=10)


file_label = ctk.CTkLabel(
    app,
    text="Sin archivo"
)

file_label.pack(pady=10)


status_label = ctk.CTkLabel(
    app,
    text="Esperando..."
)

status_label.pack(pady=10)


progress = ctk.CTkProgressBar(app)

progress.set(0)

progress.pack(pady=20)


app.mainloop()