import tkinter as tk
from tkinter import ttk
from time import sleep
import time
import keyboard as k
import random

import mouse
import pydirectinput
import ctypes, sys, os
import mouse as m
import threading

def jump():
    k.press("space")
    sleep(0.2)
    k.release("space")

def ensure_admin(): #google AI geklaut
    try:
        if ctypes.windll.shell32.IsUserAnAdmin():
            return  # schon Admin
    except Exception:
        pass
    params = " ".join(f'"{arg}"' for arg in sys.argv[1:])
    ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, params, None, 1)
    sys.exit()

ensure_admin()

# Exit fest auf ESC
EXIT_KEY = "esc"


#Spam, weil halten nicht ghgeht
def spam_key(key: str, duration_s: float, interval_s: float = 0.05):
    key = str(key).lower()
    end = time.time() + max(0.0, float(duration_s))
    while time.time() < end:
        # Abbruch nur mit ESC
        if k.is_pressed(EXIT_KEY):
            exit()
        try:
            pydirectinput.press(key)
        except Exception:
            pass
        sleep(interval_s)
# -------------------------


#Essen loop
def eat_loop():
    global eat_inv, eat_time
    start_inv = eat_inv  # Startwert merken
    pydirectinput.press(str(eat_inv))
    while True:
        try:
            # eat_inv drücken
            ##pydirectinput.press(str(eat_inv))
            sleep(1)
            mouse.click()

            sleep(eat_time * 60)

            #+1
            #eat_inv += 1

            # Wenn > 9 reset auf Ursprungswert
            #if eat_inv >= 9:
            #    eat_inv = start_inv

        except Exception:
            pass

# -------------------------

# Diese Funktion läuft in einem separaten Thread, sonst wird das GUI blockiert <-- keine ahnung, vom Tutorial geklaut
def run_sequence(seconds, rndm):
    try:
        rndm_addon = random.randint(1, max(1, int(rndm))) if rndm > 0 else 0
    except Exception:
        rndm_addon = 0
    rndm_full = rndm_addon + max(0, int(seconds))

    sleep(5)
    while True:
        # Bewegung + Sprünge
        spam_key('w', 2, interval_s=0.01)
        jump()
        spam_key('d', 2, interval_s=0.01)
        jump()
        spam_key('s', 2, interval_s=0.01)
        jump()
        spam_key('a', 2, interval_s=0.01)
        jump()
        sleep(rndm_full)

#Abschick knopf <-- ebenfalls geklaut
def submit():
    global eat_time, eat_inv
    # Werte aus den Feldern holen
    try:
        seconds = int(entry_seconds.get())
    except Exception:
        seconds = 0
    try:
        rndm = int(entry_rndm.get())
    except Exception:
        rndm = 0

    #tick box für essen ausklappen
    if essen_var.get():
        try:
            eat_time = int(entry_eat_time.get())
        except Exception:
            eat_time = 0
        try:
            eat_inv = int(entry_eat_inv.get())
        except Exception:
            eat_inv = 0

        # Essen-Thread starten
        t_eat = threading.Thread(target=eat_loop, daemon=True)
        t_eat.start()
    else:
        eat_time = 0
        eat_inv = 0

    # Bewegungs-Thread starten <-- geklaut
    t = threading.Thread(target=run_sequence, args=(seconds, rndm), daemon=True)
    t.start()

root = tk.Tk()
root.title("Anti-AFK Timer")

# Zahlen checker <--Github und eigen
vcmd = (root.register(lambda P: P.isdigit() or P == ""), "%P")

# Label + Eingabe Sekunden (nur Zahlen)
tk.Label(root, text="Sekunden:").grid(row=0, column=0, padx=10, pady=10)
entry_seconds = tk.Entry(root, validate="key", validatecommand=vcmd)
entry_seconds.grid(row=0, column=1, padx=10, pady=10)

# Label + Eingabe Randomizer (nur Zahlen)
tk.Label(root, text="Randomizer 1-n (In sekunden):").grid(row=1, column=0, padx=10, pady=10)
entry_rndm = tk.Entry(root, validate="key", validatecommand=vcmd)
entry_rndm.grid(row=1, column=1, padx=10, pady=10)

# Exit-Key Anzeige (fest auf ESC gesetzt)
tk.Label(root, text="Exit-Taste:").grid(row=2, column=0, padx=10, pady=10)
exit_var = tk.StringVar(value="ESC")
combobox = ttk.Combobox(root, textvariable=exit_var, state="readonly",
                        values=["ESC"])
combobox.grid(row=2, column=1, padx=10, pady=10)

#Essens abfrage (Knopf)
essen_var = tk.BooleanVar(value=False)

def toggle_essen():
    if essen_var.get():
        label_eat_time.grid(row=3, column=0, padx=10, pady=5)
        entry_eat_time.grid(row=3, column=1, padx=10, pady=5)
        label_eat_inv.grid(row=4, column=0, padx=10, pady=5)
        entry_eat_inv.grid(row=4, column=1, padx=10, pady=5)
    else:
        label_eat_time.grid_remove()
        entry_eat_time.grid_remove()
        label_eat_inv.grid_remove()
        entry_eat_inv.grid_remove()

tk.Checkbutton(root, text="Essen?", variable=essen_var, command=toggle_essen).grid(row=5, column=0, padx=10, pady=10)

# Essens sachen erst nach klicken zeigen
label_eat_time = tk.Label(root, text="Essens Intervall (In Minuten):")
entry_eat_time = tk.Entry(root, validate="key", validatecommand=vcmd)

label_eat_inv = tk.Label(root, text="Essens-Inventar-Start (Slot):")
entry_eat_inv = tk.Entry(root, validate="key", validatecommand=vcmd)

# -------------------------

# Buttons
tk.Button(root, text="Schließen", command=root.destroy).grid(row=7, column=1, pady=20)
tk.Button(root, text="Übernehmen", command=submit).grid(row=7, column=0, pady=20)

root.mainloop()
