import tkinter as tk

import requests

FONT = ("Verdana", 12)
FONT_B = ("Verdana", 12, 'bold')
FONT_LARGE = ("Verdana", 20)
URL = "http://localhost:8000/api/authenticate"
URL_REGISTER = "http://localhost:8000/api/register"
URL_PROFILE = "http://localhost:8000/api/profile"


class SmartPicasso(tk.Tk):

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        container = tk.Frame(self)
        self.title('SmartPicasso')
        self.geometry('610x460')

        container.pack(side="top", fill="both", expand=True)

        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.frames = {}

        for F in (LoginView, MainView, RegisterView):
            frame = F(container, self)

            self.frames[F] = frame

            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame(LoginView)

    def show_frame(self, view, token=None):
        frame = self.frames[view]
        frame.tkraise()

        if token:
            frame.token = token


class LoginView(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        label = tk.Label(self, text="SmartPicasso", font=FONT_LARGE)
        label.pack(pady=10, padx=10)

        label1 = tk.Label(self, text='Login:', font=FONT)
        label1.pack()

        input1 = tk.Entry(self)
        input1.pack()

        label2 = tk.Label(self, text='Password:', font=FONT)
        label2.pack()

        input2 = tk.Entry(self, show="*")
        input2.pack()

        button = tk.Button(self, text="Login", font=FONT,
                           command=lambda: self.login(controller, input1.get(), input2.get()))
        button.pack()

        button2 = tk.Button(self, text="Register", font=FONT, command=lambda: controller.show_frame(RegisterView))
        button2.pack()

    def login(self, controller, login, password):
        print(login)
        print(password)
        data = {
            "email": str(login),
            "password": str(password)
        }
        resp = requests.post(URL, json=data)
        print(resp)
        if resp.status_code == 200:
            response = resp.json()
            token = response['token']

            controller.show_frame(MainView, token)
        else:
            print("bad pass")
            bad_pass_label = tk.Label(self, text='Wrong login/password!', font=FONT)
            bad_pass_label.pack()
        return ()


class MainView(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.frames = {}
        self.token = ''
        for F in (ProfileView,):
            frame = F(parent, controller)

            self.frames[F] = frame

            frame.grid(row=0, column=0, sticky="nsew")
        label = tk.Label(self, text="SmartPicasso", font=FONT_LARGE)
        label.pack(pady=10, padx=10)
        label_u = tk.Label(self, text="Main menu", font=FONT)
        label_u.pack(pady=10, padx=10)

        button_profile = tk.Button(self, text="My profile", font=FONT,
                                   command=lambda: self.show_frame(ProfileView))
        button_profile.pack()

    def show_frame(self, view):
        frame = self.frames[view]
        frame.tkraise()

        if self.token:
            print(self.token)
            frame.token = self.token
            frame.start()


class RegisterView(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        label = tk.Label(self, text="SmartPicasso", font=FONT_LARGE)
        label.pack(pady=10, padx=10)
        label_u = tk.Label(self, text="Register", font=FONT)
        label_u.pack(pady=10, padx=10)

        label0 = tk.Label(self, text='Email:', font=FONT)
        label0.pack()

        input0 = tk.Entry(self)
        input0.pack()

        label1 = tk.Label(self, text='Login:', font=FONT)
        label1.pack()

        input1 = tk.Entry(self)
        input1.pack()

        label2 = tk.Label(self, text='Password:', font=FONT)
        label2.pack()

        input2 = tk.Entry(self, show="*")
        input2.pack()

        label3 = tk.Label(self, text='First name:', font=FONT)
        label3.pack()

        input3 = tk.Entry(self)
        input3.pack()

        label4 = tk.Label(self, text='Last name:', font=FONT)
        label4.pack()

        input4 = tk.Entry(self)
        input4.pack()

        button1 = tk.Button(self, text="Register", font=FONT,
                            command=lambda: self.register(controller, input0.get(), input1.get(), input2.get(),
                                                          input3.get(), input4.get()))
        button1.pack()

        button2 = tk.Button(self, text="Cancel", font=FONT, command=lambda: controller.show_frame(LoginView))
        button2.pack()

    def register(self, controller, email, login, passw, name, lastname):
        data = {
            "email": str(email),
            "password": str(passw),
            "profile": {
                "username": str(login),
                "first_name": str(name),
                "last_name": str(lastname)
            }
        }
        print(data)
        response = requests.post(URL_REGISTER, json=data)
        print(response)
        if response.status_code == 201:
            response = response.json()
            controller.show_frame(LoginView)
        else:
            print("sth wrong")
            bad_pass_label = tk.Label(self, text='Something went wrong!', font=FONT)
            bad_pass_label.pack()
        return ()


class ProfileView(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.token = ''
        label = tk.Label(self, text="SmartPicasso", font=FONT_LARGE)
        label.pack(pady=10, padx=10)
        label_l1 = tk.Label(self, text="Login:", font=FONT_B)
        label_l1.pack(pady=10, padx=10)
        self.label_username = tk.Label(self, text='', font=FONT)
        self.label_username.pack(pady=10, padx=10)
        label_n1 = tk.Label(self, text="Name:", font=FONT_B)
        label_n1.pack(pady=10, padx=10)
        self.label_first_name = tk.Label(self, text='', font=FONT)
        self.label_first_name.pack(pady=10, padx=10)
        label_ln1 = tk.Label(self, text="Last name", font=FONT_B)
        label_ln1.pack(pady=10, padx=10)
        self.label_last_name = tk.Label(self, text='', font=FONT)
        self.label_last_name.pack(pady=10, padx=10)

        button_profile = tk.Button(self, text="Back", font=FONT,
                                   command=lambda: controller.show_frame(MainView, self.token))
        button_profile.pack()

    def start(self):
        headers = {'Authorization': 'Bearer ' + self.token}
        resp = requests.get(URL_PROFILE, headers=headers)
        response = resp.json()
        print(response)
        self.label_username['text'] = response['profile']['username']
        self.label_first_name['text'] = response['profile']['first_name']
        self.label_last_name['text'] = response['profile']['last_name']


app = SmartPicasso()
app.mainloop()