import os
import time
from pathlib import Path
from subprocess import Popen
from tkinter import (
    BOTH,
    LEFT,
    RAISED,
    RIGHT,
    TOP,
    Button,
    Frame,
    Label,
    PhotoImage,
    StringVar,
    Tk,
    mainloop,
    messagebox,
)


class ClickerGame:
    """Перед запуском проверьте и исправьте место установки AHK
    Св-во класса AHK_PATH должно содержать полный путь до запускаемого файла,
    если приложение установлено не в папки по умолчанию
    """

    AHK_PATH = "<Введите сюда путь до приложения AutoHotKey>"

    def __init__(self):
        # Поиск места установки AutoHotKey
        self.is_ahk_path_set = False
        if os.path.isfile(
            app_exe := os.path.join(
                Path.home(),
                "AppData",
                "Local",
                "Programs",
                "AutoHotkey",
                "UX",
                "AutoHotkeyUX.exe",
            )
        ):
            self.AHK_PATH = app_exe
            self.is_ahk_path_set = True
        elif os.path.isfile(
            app_exe := os.path.join(
                r"c:\\", "Program Files", "AutoHotkey", "UX", "AutoHotkeyUX.exe"
            )
        ):
            self.AHK_PATH = app_exe
            self.is_ahk_path_set = True
        else:
            messagebox.showerror(
                "Can't find AutoHotKey",
                """Пропишите AHK_PATH До этого, автокликер работать не будет""",
            )

        self.__root = Tk()
        self.__root.geometry("500x400")
        self.__root.minsize(500, 400)
        self.__root.title("Clicker Game")
        self.__root.bind("<Key>", self.key)

        self.process = None

        self.ahk_flag = False  # Флаг запущен ли скрипт кликера
        self.frame = Frame(self.__root, relief=RAISED, borderwidth=5, bg="green")
        self.frame.pack(fill=BOTH, expand=True, padx=5, pady=5)
        self.label = Label(
            self.frame, text="Clicker Game", font=("Arial", 25), bg="green"
        )
        self.label.pack(side=TOP)

        self.score = 0
        self.message = StringVar()
        self.message.set(f"Ваш счет: {self.score}")
        self.label2 = Label(
            self.frame, textvariable=self.message, font=("Arial", 15), bg="green"
        )
        self.label2.pack(side=TOP)

        self.timer = 0
        self.start_time = time.time()
        self.timer_message = StringVar()
        self.timer_update()

        self.label3 = Label(
            self.frame, textvariable=self.timer_message, font=("Arial", 12), bg="green"
        )
        self.label3.pack(side=LEFT)

        self.img = PhotoImage(file=os.path.join(os.curdir, "img.png"))
        self.clicker = Button(
            self.frame, text="clickme", image=self.img, command=self.increment
        )
        self.clicker.place(relx=0.5, rely=0.5, anchor="center")

        self.ahk_button = Button(
            self.__root, text="Запустить AHK", command=self.switcher_ahk
        )
        self.ahk_button.pack(side=LEFT, padx=10, pady=10)

        self.close_button = Button(self.__root, text="Выход", command=self.quit)
        self.close_button.pack(side=RIGHT, padx=10, pady=10)

        self.ahk_button = Button(
            self.__root, text="Сброс игры", command=self.clicker_reset
        )
        self.ahk_button.pack(side=RIGHT, padx=10, pady=10)

        mainloop()

    def __del__(self):
        """Завершаем поток АНК ели он запущен при
        уничтожении игры.
        Можно было и в метод quit разместить, но
        правильнее добавить деструктор обекта"""
        if self.ahk_flag:
            self.switcher_ahk()

    def key(self, event):
        """Отлавливаем все event в игре, в т.ч и
        нажатия клавиш клавиатуры. Обрабатываем
        интересующие нас"""
        if event.keycode == 97:
            # Переключаем статус АНК по numpad1
            self.switcher_ahk()

        if event.keycode == 73 or event.keycode == 17:
            # Инкремент счетчика по хот кею Ctrl-i или Ctrl-ш в RU раскладке
            self.increment()

    def increment(self, keys=None):
        if keys is not None:
            """Данный блок необходим, чтоб среда не ругалась на неиспользуемый
            аргумент keys. При связывании горячей клавиши методом bind, сюда
            передается инфо о нажатой комбинации. Тут она мне не нужна, поэтому
            ставим тупо заглушку"""
            pass

        self.score += 1
        self.message.set(f"Ваш счет: {self.score}")

    def switcher_ahk(self):
        """Переключаем состояние кликера(вкл/выкл),
        если путь к нему установлен или выводим
        сообщение с предупреждением"""
        if not self.is_ahk_path_set:
            messagebox.showerror(
                "Can't find AutoHotKey",
                """Не могу запустить автокликер. Не указан путь к AutoHotKey""",
            )
        elif self.ahk_flag:
            self.ahk_flag = False
            self.process.kill()
        else:
            self.ahk_flag = True
            self.process = Popen([self.AHK_PATH, "clicker.ahk"])

    def timer_update(self):
        self.timer = int(time.time() - self.start_time)
        self.timer_message.set(
            f"Время игры:\n{self.timer // 60}мин. {self.timer % 60} сек."
        )
        self.__root.after(1000, self.timer_update)

    def clicker_reset(self):
        if self.ahk_flag:
            self.switcher_ahk()
        self.score = 0
        self.message.set(f"Ваш счет: {self.score}")
        self.timer = 0
        self.start_time = time.time()
        self.timer_update()

    def quit(self):
        self.__root.destroy()


if __name__ == "__main__":
    game = ClickerGame()