import logging
import time
import tkinter as tk
import tkinter.ttk as ttk
import typing

from ttkthemes import ThemedTk

from fishy import helper
from fishy.web import web

from ..constants import chalutier, lam2
from ..helper.config import config
from .discord_login import discord_login
from ..helper.hotkey.hotkey_process import hotkey
from ..helper.hotkey.process import Key

if typing.TYPE_CHECKING:
    from . import GUI


def _apply_theme(gui: 'GUI'):
    dark = config.get("dark_mode", True)
    gui._root["theme"] = "equilux" if dark else "breeze"
    gui._console["background"] = "#707070" if dark else "#ffffff"
    gui._console["fg"] = "#ffffff" if dark else "#000000"


# noinspection PyProtectedMember
def _create(gui: 'GUI'):
    engines = gui.engines

    gui._root = ThemedTk(theme="equilux", background=True)
    gui._root.title("Fishybot for Elder Scrolls Online")
    gui._root.iconbitmap(helper.manifest_file('icon.ico'))

    # region menu
    menubar = tk.Menu(gui._root)

    filemenu = tk.Menu(menubar, tearoff=0)

    login = web.is_logged_in()
    gui.login = tk.IntVar()
    gui.login.set(1 if login > 0 else 0)
    state = tk.DISABLED if login == -1 else tk.ACTIVE
    filemenu.add_checkbutton(label="Login", command=lambda: discord_login(gui), variable=gui.login, state=state)
    filemenu.add_command(label="Create Shortcut", command=lambda: helper.create_shortcut(False))
    # filemenu.add_command(label="Create Anti-Ghost Shortcut", command=lambda: helper.create_shortcut(True))

    def _toggle_mode():
        config.set("dark_mode", not config.get("dark_mode", True))
        gui._start_restart = True

    dark_mode_var = tk.IntVar()
    dark_mode_var.set(int(config.get('dark_mode', True)))
    filemenu.add_checkbutton(label="Dark Mode", command=_toggle_mode,
                             variable=dark_mode_var)
    if config.get("dont_ask_update", False):
        filemenu.add_command(label="Update", command=helper.update)

    def installer():
        if filemenu.entrycget(4, 'label') == "Remove Chalutier":
            if helper.remove_addon(chalutier[0]) == 0:
                filemenu.entryconfigure(4, label="Install Chalutier")
        else:
            r = helper.install_addon(*chalutier)
            r += helper.install_addon(*lam2)
            if r == 0:
                filemenu.entryconfigure(4, label="Remove Chalutier")
    chaEntry = "Remove Chalutier" if helper.addon_exists(chalutier[0]) else "Install Chalutier"
    filemenu.add_command(label=chaEntry, command=installer)
    menubar.add_cascade(label="Options", menu=filemenu)

    debug_menu = tk.Menu(menubar, tearoff=0)
    debug_menu.add_command(label="Check PixelVal",
                           command=lambda: gui.engine.check_pixel_val())

    debug_var = tk.IntVar()
    debug_var.set(int(config.get('debug', False)))

    def keep_console():
        config.set("debug", bool(debug_var.get()))
        logging.debug("Restart to update the changes")

    debug_menu.add_checkbutton(label="Keep Console", command=keep_console, variable=debug_var)
    debug_menu.add_command(label="Restart", command=helper.restart)
    menubar.add_cascade(label="Debug", menu=debug_menu)

    help_menu = tk.Menu(menubar, tearoff=0)
    help_menu.add_command(label="Need Help?", command=lambda: helper.open_web("https://github.com/fishyboteso/fishyboteso/wiki"))
    help_menu.add_command(label="Donate", command=lambda: helper.open_web("https://paypal.me/AdamSaudagar"))
    menubar.add_cascade(label="Help", menu=help_menu)

    gui._root.config(menu=menubar)
    # endregion

    # region console
    gui._console = tk.Text(gui._root, state='disabled', wrap='none', background="#707070", fg="#ffffff")
    gui._console.pack(fill=tk.BOTH, expand=True, pady=(15, 15), padx=(10, 10))
    gui._console.mark_set("sentinel", tk.INSERT)
    gui._console.config(state=tk.DISABLED)
    # endregion

    # region controls
    start_frame = ttk.Frame(gui._root)

    gui._engine_var = tk.StringVar(start_frame)
    labels = list(engines.keys())
    last_started = config.get("last_started", labels[0])
    gui._engine_select = ttk.OptionMenu(start_frame, gui._engine_var, last_started, *labels)
    gui._engine_select.pack(side=tk.LEFT)

    gui._config_button = ttk.Button(start_frame, text="⚙", width=0,
                                    command=lambda: engines[gui._engine_var.get()].config())
    gui._config_button.pack(side=tk.RIGHT)

    gui._start_button = ttk.Button(start_frame, text=gui._get_start_stop_text(), width=25,
                                   command=gui.funcs.start_engine)
    gui._start_button.pack(side=tk.RIGHT)

    start_frame.pack(padx=(10, 10), pady=(5, 15), fill=tk.X)
    # endregion

    _apply_theme(gui)
    gui._root.update()
    gui._root.minsize(gui._root.winfo_width() + 10, gui._root.winfo_height() + 10)
    if config.get("win_loc") is not None:
        gui._root.geometry(config.get("win_loc"))

    hotkey.hook(Key.F9, gui.funcs.start_engine)

    # noinspection PyProtectedMember
    def set_destroy():
        if gui._bot_running:
            if not tk.messagebox.askyesno(title="Quit?", message="Bot engine running. Quit Anyway?"):
                return

        config.set("win_loc", gui._root.geometry())
        gui._destroyed = True

    gui._root.protocol("WM_DELETE_WINDOW", set_destroy)
    gui._destroyed = False

    while True:
        gui._root.update()
        gui._clear_function_queue()
        if gui._start_restart:
            gui._root.destroy()
            gui._root.quit()
            gui._start_restart = False
            gui.create()
        if gui._destroyed:
            gui.engine.quit()
            break
        time.sleep(0.01)
