import os
import pathlib
import pickle
from hashlib import sha256
from tkinter import Button, Entry, Label, StringVar, Tk, filedialog

from PIL import Image, ImageTk

from misc import alert, get_os


def __get_config_folder():
    _os = get_os()
    if _os == "linux":
        folder = os.path.join(os.getenv("HOME"), ".munyal")
    else:
        folder = os.path.join(os.path.expandvars("%APPDATA%"), "Munyal")
    return folder


def get_config():
    while True:
        config = __get_config()
        if not config:
            gui_config()
        else:
            return config


def __get_config():
    folder = __get_config_folder()
    config_file = os.path.join(folder, "config")
    if os.path.exists(config_file):
        config_bytes = open(config_file, "rb")
        config = pickle.load(config_bytes)
        config_bytes.close()
        return config


def __validate_values(user, password):
    return True


def _set_config(root, user, password, folder):
    passwd_hash = sha256(password.get().encode("utf-8")).hexdigest()
    if not user:
        alert(root, "Introduce tu usuario de la red Munyal")
    elif not password:
        alert(root, "Introduce tu contraseña")
    elif not folder:
        alert(root, "Elige la carpeta que quieres sincronizar")
    elif not __validate_values(user, passwd_hash):
        alert(
            root,
            "Tu usuario o contraseña son incorrectos, favor de reintentarlo")
    else:
        password.set("")
        folder_config = __get_config_folder()
        path = pathlib.Path(folder_config)
        path.mkdir(parents=True, exist_ok=True)
        with open(os.path.join(folder_config, "config"), "wb") as config_file:
            config_file.write(
                pickle.dumps({
                    "login": {
                        "user": user,
                        "password": passwd_hash
                    },
                    "folder": folder
                }))
        root.destroy()


def gui_config():
    root = Tk()
    root.geometry("250x420")

    img_logo = Image.open("img/logo.png")
    img_tk = ImageTk.PhotoImage(img_logo.resize((200, 150), Image.ANTIALIAS))

    host = StringVar()
    host.set("localhost")
    host_field = Entry(root, textvariable=host)

    passwd = StringVar()
    passwd_field = Entry(root, textvariable=passwd, show="*")

    folder = StringVar()
    folder.set(os.path.join(os.getenv("HOME"), "Munyal"))
    folder_field = Entry(root, textvariable=folder)
    btn_folder = Button(root,
                        text="Examinar",
                        command=lambda: search_folder(folder))

    connect = Button(
        root,
        text="Conectar",
        command=lambda: _set_config(root, host.get(), passwd, folder.get()))

    Label(root, text="MUNYAL").pack()
    Label(root, image=img_tk).pack()
    Label(root, text="").pack()
    Label(root, text="Ruta del servidor").pack()
    host_field.pack()
    Label(root, text="").pack()
    Label(root, text="Contraseña").pack()
    passwd_field.pack()
    Label(root, text="").pack()
    Label(root, text="Carpeta a sincronizar").pack()
    folder_field.pack()
    btn_folder.pack()
    Label(root, text="").pack()
    connect.pack()

    root.mainloop()


def search_folder(field):
    path = filedialog.askdirectory()
    field.set(path)


if __name__ == "__main__":
    print(get_config())