#!/usr/bin/env python3
import tkinter as tk
from tkinter import filedialog, messagebox
import subprocess
import os
import sys

# Globaler Pfad zur QET-Datei
qet_file = ""

def select_file():
    global qet_file
    filename = filedialog.askopenfilename(
        title="QET-Datei auswählen",
        filetypes=[("QET Dateien", "*.qet"), ("Alle Dateien", "*.*")]
    )
    if filename:
        qet_file = filename
        file_label.config(text=qet_file)
    else:
        file_label.config(text="Keine Datei ausgewählt")

def create_new_qet_filename(original_qet, suffix):
    """
    Erzeugt einen neuen Dateinamen im selben Verzeichnis wie 'original_qet',
    wobei der Basisname ein zusätzliches 'suffix' erhält.
    """
    dir_of_qet = os.path.dirname(original_qet)
    base_of_qet = os.path.basename(original_qet)
    base, ext = os.path.splitext(base_of_qet)
    new_name = f"{base}{suffix}{ext}"
    return os.path.join(dir_of_qet, new_name)

def create_processes():
    if not qet_file:
        messagebox.showerror("Fehler", "Bitte zuerst eine QET-Datei auswählen.")
        return

    script_dir = os.path.dirname(os.path.abspath(__file__))
    python_exe = sys.executable  # Benutze eingebetteten Interpreter

    commands = []

    # Bauteile nummerieren (NEU)
    if var_nummerierung.get():
        out_file = create_new_qet_filename(qet_file, "_nummeriert")
        commands.append([python_exe, os.path.join(script_dir, "Nummerierung.py"), qet_file, out_file])

    # Klemmen
    if var_klemmen.get():
        out_file = create_new_qet_filename(qet_file, "_klemmen")
        commands.append([python_exe, os.path.join(script_dir, "Klemmen.py"), qet_file, out_file])

    # Klemmenplan als CSV
    if var_klemmplan.get():
        out_file = create_new_qet_filename(qet_file, "_klemmplan_csv")
        commands.append([python_exe, os.path.join(script_dir, "Klemmplan_csv.py"), qet_file, out_file])

    # Klemmenplan in QET einfügen
    if var_klemmplan_qet.get():
        out_file = create_new_qet_filename(qet_file, "_klemmplan_qet")
        commands.append([python_exe, os.path.join(script_dir, "Klemmenplan_qet.py"), qet_file, out_file])

    # Kabelliste als CSV
    if var_kabelliste.get():
        out_file = os.path.join(os.path.dirname(qet_file), "kabelliste.csv")
        commands.append([python_exe, os.path.join(script_dir, "Kabelliste_csv.py"), qet_file, out_file])

    # Kabelliste in QET einfügen
    if var_kabelliste_qet.get():
        out_file = create_new_qet_filename(qet_file, "_kabelliste_qet")
        commands.append([python_exe, os.path.join(script_dir, "Kabelliste_qet.py"), qet_file, out_file])

    # Verdrahtungsplan -> ruft Adern.py mit Flags auf
    if var_verdrahtungsplan.get():
        cmd = [python_exe, os.path.join(script_dir, "Adern.py"), qet_file, "--verd"]
        if var_v_kabel.get():
            cmd.append("--kabel")
        if var_v_debug.get():
            cmd.append("--debug")
        if var_v_dups.get():
            cmd.append("--dups")
        commands.append(cmd)

    # Seiten löschen von-bis
    if var_seiten_loeschen.get():
        von = entry_von.get().strip()
        bis = entry_bis.get().strip()
        if not von.isdigit() or not bis.isdigit():
            messagebox.showerror("Fehler", "Bitte gültige Seitennummern (nur Ziffern) eingeben.")
            return
        suffix = f"_seiten_{von}-{bis}"
        out_file = create_new_qet_filename(qet_file, suffix)
        commands.append([
            python_exe, os.path.join(script_dir, "Seiten_loeschen.py"), qet_file, out_file, von, bis
        ])

    if not commands:
        messagebox.showinfo("Info", "Bitte mindestens eine Funktion auswählen.")
        return

    # Ausführen aller Kommandos
    env_base = os.environ.copy()
    existing_pp = env_base.get('PYTHONPATH', '')
    if existing_pp:
        env_base['PYTHONPATH'] = script_dir + os.pathsep + existing_pp
    else:
        env_base['PYTHONPATH'] = script_dir

    for cmd in commands:
        try:
            print("Starte:", cmd, "cwd=", script_dir, "PYTHONPATH=", env_base['PYTHONPATH'])
            result = subprocess.run(
                cmd,
                check=True,
                capture_output=True,
                text=True,
                cwd=script_dir,
                env=env_base
            )
            print(f"Kommando: {' '.join(cmd)}")
            print(f"Ausgabe von {os.path.basename(cmd[1])}:\n{result.stdout}")
            print(f"Fehlermeldungen von {os.path.basename(cmd[1])}:\n{result.stderr}")
        except subprocess.CalledProcessError as e:
            message = (
                f"Fehler beim Ausführen von {os.path.basename(e.cmd[1])}:\n\n"
                f"Kommando: {' '.join(e.cmd)}\n\n"
                f"Returncode: {e.returncode}\n\n"
                f"--- STDOUT ---\n{e.stdout}\n"
                f"--- STDERR ---\n{e.stderr}"
            )
            messagebox.showerror("Fehler", message)
            return

    messagebox.showinfo("Erfolg", "Ausgewählte Funktionen wurden erfolgreich ausgeführt.")

def toggle_delete_entries():
    state = tk.NORMAL if var_seiten_loeschen.get() else tk.DISABLED
    entry_von.config(state=state)
    entry_bis.config(state=state)

def toggle_verdrahtungsplan():
    state = tk.NORMAL if var_verdrahtungsplan.get() else tk.DISABLED
    chk_v_kabel.config(state=state)
    chk_v_debug.config(state=state)
    chk_v_dups.config(state=state)
    if not var_verdrahtungsplan.get():
        var_v_kabel.set(False)
        var_v_debug.set(False)
        var_v_dups.set(False)

def quit_app():
    root.destroy()

# GUI aufbauen
root = tk.Tk()
root.title("QElectroTech Extrafunktionen")

# Dateiauswahl
frame_file = tk.Frame(root)
frame_file.pack(pady=10)
btn_select = tk.Button(frame_file, text="QET-Datei auswählen", command=select_file)
btn_select.pack(side=tk.LEFT)
file_label = tk.Label(frame_file, text="Keine Datei ausgewählt", width=50, anchor="w")
file_label.pack(side=tk.LEFT, padx=10)

# Checkboxen
frame_checks = tk.Frame(root)
frame_checks.pack(pady=10)

var_nummerierung = tk.BooleanVar() # NEU: Variable für Nummerierung
var_klemmen = tk.BooleanVar()
var_kabelliste = tk.BooleanVar()
var_klemmplan = tk.BooleanVar()
var_klemmplan_qet = tk.BooleanVar()
var_kabelliste_qet = tk.BooleanVar()
var_seiten_loeschen = tk.BooleanVar()

var_verdrahtungsplan = tk.BooleanVar()
var_v_kabel = tk.BooleanVar()
var_v_debug = tk.BooleanVar()
var_v_dups = tk.BooleanVar()

# NEU: Checkbox für Nummerierung
chk_nummerierung = tk.Checkbutton(frame_checks, text="Bauteile nummerieren", variable=var_nummerierung)
chk_klemmen = tk.Checkbutton(frame_checks, text="Klemmen durchzählen", variable=var_klemmen)
chk_klemmplan = tk.Checkbutton(frame_checks, text="Klemmenplan als CSV erstellen", variable=var_klemmplan)
chk_klemmplan_qet = tk.Checkbutton(frame_checks, text="Klemmenplan in QET einfügen", variable=var_klemmplan_qet)
chk_kabelliste = tk.Checkbutton(frame_checks, text="Kabelliste als CSV erstellen", variable=var_kabelliste)
chk_kabelliste_qet = tk.Checkbutton(frame_checks, text="Kabelliste in QET einfügen", variable=var_kabelliste_qet)

# Neue Checkbox ganz oben packen
chk_nummerierung.pack(anchor="w")
chk_klemmen.pack(anchor="w")
chk_klemmplan.pack(anchor="w")
chk_klemmplan_qet.pack(anchor="w")
chk_kabelliste.pack(anchor="w")
chk_kabelliste_qet.pack(anchor="w")

chk_verdrahtungsplan = tk.Checkbutton(frame_checks, text="Verdrahtungsplan erstellen", variable=var_verdrahtungsplan, command=toggle_verdrahtungsplan)
chk_verdrahtungsplan.pack(anchor="w", pady=(6,0))

frame_verd_sub = tk.Frame(frame_checks)
frame_verd_sub.pack(anchor="w", padx=20)

chk_v_kabel = tk.Checkbutton(frame_verd_sub, text="Kabel rausfiltern (Bauteil enthält 'W')", variable=var_v_kabel)
chk_v_debug = tk.Checkbutton(frame_verd_sub, text="Debug erstellen (Debug-CSV)", variable=var_v_debug)
chk_v_dups = tk.Checkbutton(frame_verd_sub, text="Duplikate erstellen (Duplicates-CSV)", variable=var_v_dups)

chk_v_kabel.pack(anchor="w")
chk_v_debug.pack(anchor="w")
chk_v_dups.pack(anchor="w")

chk_v_kabel.config(state=tk.DISABLED)
chk_v_debug.config(state=tk.DISABLED)
chk_v_dups.config(state=tk.DISABLED)

chk_seiten_loeschen = tk.Checkbutton(frame_checks, text="Seiten löschen", variable=var_seiten_loeschen, command=toggle_delete_entries)
chk_seiten_loeschen.pack(anchor="w")

# Eingabefelder für Seitenbereich
frame_delete = tk.Frame(root)
frame_delete.pack(pady=5)

lbl_von = tk.Label(frame_delete, text="von:")
entry_von = tk.Entry(frame_delete, width=5, state=tk.DISABLED)
lbl_bis = tk.Label(frame_delete, text="bis:")
entry_bis = tk.Entry(frame_delete, width=5, state=tk.DISABLED)

lbl_von.pack(side=tk.LEFT)
entry_von.pack(side=tk.LEFT, padx=(0,10))
lbl_bis.pack(side=tk.LEFT)
entry_bis.pack(side=tk.LEFT)

# Buttons
frame_buttons = tk.Frame(root)
frame_buttons.pack(pady=10)
btn_create = tk.Button(frame_buttons, text="Erstellen", command=create_processes)
btn_create.pack(side=tk.LEFT, padx=10)
btn_quit = tk.Button(frame_buttons, text="Beenden", command=quit_app)
btn_quit.pack(side=tk.LEFT, padx=10)

root.mainloop()
