from tkinter import *
from tkinter import ttk
import database
import admin_dashboard
import student_dashboard
import ui_utils


def _auth_window(title):
    root = Tk()
    root.title(title)
    root.resizable(False, False)
    root.configure(bg=ui_utils.BG_COLOR)

    window_width = 820
    window_height = 620
    screen_width = root.winfo_screenwidth()
    screen_height = root.winfo_screenheight()
    x = int((screen_width - window_width) / 2)
    y = int((screen_height - window_height) / 2)
    root.geometry(f"{window_width}x{window_height}+{x}+{y}")

    container = Frame(
        root, bg=ui_utils.BG_COLOR,
        highlightbackground=ui_utils.BORDER_COLOR, highlightthickness=1,
    )
    container.pack(fill=BOTH, expand=True, padx=2, pady=2)

    left_frame = Frame(container, bg=ui_utils.SIDEBAR_COLOR, width=380)
    left_frame.pack(side=LEFT, fill=BOTH, expand=True)
    left_frame.pack_propagate(False)

    Label(
        left_frame, text="READPATH",
        font=("Helvetica Neue", 36, "bold"),
        fg=ui_utils.TEXT_ON_DARK, bg=ui_utils.SIDEBAR_COLOR,
    ).place(relx=0.5, rely=0.38, anchor=CENTER)

    Label(
        left_frame, text="Smart Library Navigator",
        font=("Helvetica Neue", 16),
        fg="#94a3b8", bg=ui_utils.SIDEBAR_COLOR,
    ).place(relx=0.5, rely=0.52, anchor=CENTER)

    Label(
        left_frame,
        text="Each student gets their own account.\nSign up once, then sign in anytime.",
        font=ui_utils.FONT_SMALL, fg="#64748b", bg=ui_utils.SIDEBAR_COLOR,
        justify=CENTER,
    ).place(relx=0.5, rely=0.65, anchor=CENTER)

    right_frame = Frame(container, bg=ui_utils.CARD_COLOR, width=440)
    right_frame.pack(side=RIGHT, fill=BOTH, expand=True)
    right_frame.pack_propagate(False)

    ui_utils.setup_app_style(root)
    return root, right_frame


def signup_screen():
    root, right_frame = _auth_window("Readpath — Create Account")

    form_frame = Frame(right_frame, bg=ui_utils.CARD_COLOR)
    form_frame.place(relx=0.5, rely=0.5, anchor=CENTER)

    Label(
        form_frame, text="Create Student Account",
        font=ui_utils.FONT_TITLE, fg=ui_utils.TEXT_PRIMARY, bg=ui_utils.CARD_COLOR,
    ).grid(row=0, column=0, columnspan=2, pady=(0, 8), sticky=W)

    Label(
        form_frame,
        text="Your account is saved in the library database",
        font=ui_utils.FONT_SMALL, fg=ui_utils.TEXT_MUTED, bg=ui_utils.CARD_COLOR,
    ).grid(row=1, column=0, columnspan=2, pady=(0, 16), sticky=W)

    fields = [
        ("Username", False),
        ("Email", False),
        ("Password", True),
        ("Confirm Password", True),
        ("Student Number", False),
    ]
    entries = {}
    row = 2
    for label, is_password in fields:
        Label(
            form_frame, text=label, font=ui_utils.FONT_NORMAL,
            fg=ui_utils.TEXT_PRIMARY, bg=ui_utils.CARD_COLOR,
        ).grid(row=row, column=0, columnspan=2, sticky=W, pady=(0, 4))
        entry = ui_utils.make_entry(form_frame, width=32, show="*" if is_password else None)
        entry.grid(row=row + 1, column=0, columnspan=2, pady=(0, 8))
        entries[label] = entry
        row += 2

    message_label = Label(
        form_frame, text="", font=ui_utils.FONT_SMALL,
        fg=ui_utils.DANGER, bg=ui_utils.CARD_COLOR, wraplength=320, justify=LEFT,
    )
    message_label.grid(row=row, column=0, columnspan=2, pady=(0, 8), sticky=W)
    row += 1

    def create_account():
        username = entries["Username"].get()
        email = entries["Email"].get()
        password = entries["Password"].get()
        confirm = entries["Confirm Password"].get()
        student_number = entries["Student Number"].get()

        if password != confirm:
            message_label.config(text="Passwords do not match.", fg=ui_utils.DANGER)
            return

        success, message = database.register_student(username, password, student_number, email)
        if success:
            saved_username = username.strip()
            message_label.config(text=message, fg=ui_utils.SUCCESS)
            root.after(1500, lambda: (root.destroy(), login_screen(saved_username)))
        else:
            message_label.config(text=message, fg=ui_utils.DANGER)

    ttk.Button(
        form_frame, text="Create Account", style="Primary.TButton", command=create_account,
    ).grid(row=row, column=0, columnspan=2, pady=(8, 0), sticky=EW)
    row += 1

    def go_login():
        root.destroy()
        login_screen()

    signin_link = Label(
        form_frame,
        text="Already have an account? Sign in",
        font=ui_utils.FONT_SMALL, fg=ui_utils.ACCENT, bg=ui_utils.CARD_COLOR,
        cursor="hand2",
    )
    signin_link.grid(row=row, column=0, columnspan=2, pady=(16, 0))
    signin_link.bind("<Button-1>", lambda e: go_login())

    entries["Student Number"].bind("<Return>", lambda e: create_account())
    entries["Confirm Password"].bind("<Return>", lambda e: entries["Student Number"].focus())
    entries["Password"].bind("<Return>", lambda e: entries["Confirm Password"].focus())
    entries["Email"].bind("<Return>", lambda e: entries["Password"].focus())
    entries["Username"].bind("<Return>", lambda e: entries["Email"].focus())

    root.mainloop()


def login_screen(prefill_username=""):
    root, right_frame = _auth_window("Readpath — Sign In")

    form_frame = Frame(right_frame, bg=ui_utils.CARD_COLOR)
    form_frame.place(relx=0.5, rely=0.5, anchor=CENTER)

    Label(
        form_frame, text="Sign In",
        font=ui_utils.FONT_TITLE, fg=ui_utils.TEXT_PRIMARY, bg=ui_utils.CARD_COLOR,
    ).grid(row=0, column=0, columnspan=2, pady=(0, 8), sticky=W)

    Label(
        form_frame,
        text="Use the username and password from your account",
        font=ui_utils.FONT_SMALL, fg=ui_utils.TEXT_MUTED, bg=ui_utils.CARD_COLOR,
    ).grid(row=1, column=0, columnspan=2, pady=(0, 24), sticky=W)

    Label(
        form_frame, text="Username", font=ui_utils.FONT_NORMAL,
        fg=ui_utils.TEXT_PRIMARY, bg=ui_utils.CARD_COLOR,
    ).grid(row=2, column=0, columnspan=2, sticky=W, pady=(0, 4))
    username_entry = ui_utils.make_entry(form_frame, width=32)
    username_entry.grid(row=3, column=0, columnspan=2, pady=(0, 12))
    if prefill_username:
        username_entry.insert(0, prefill_username)
        username_entry.focus()

    Label(
        form_frame, text="Password", font=ui_utils.FONT_NORMAL,
        fg=ui_utils.TEXT_PRIMARY, bg=ui_utils.CARD_COLOR,
    ).grid(row=4, column=0, columnspan=2, sticky=W, pady=(0, 4))
    password_entry = ui_utils.make_entry(form_frame, width=32, show="*")
    password_entry.grid(row=5, column=0, columnspan=2, pady=(0, 8))
    if prefill_username:
        password_entry.focus()

    message_label = Label(
        form_frame, text="", font=ui_utils.FONT_SMALL,
        fg=ui_utils.DANGER, bg=ui_utils.CARD_COLOR, wraplength=320, justify=LEFT,
    )
    message_label.grid(row=6, column=0, columnspan=2, pady=(0, 8), sticky=W)

    def login():
        result = database.authenticate(username_entry.get(), password_entry.get())
        if result:
            user_id, role = result
            root.destroy()
            if role == "admin":
                admin_dashboard.open_admin_dashboard(user_id)
            else:
                student_dashboard.open_student_dashboard(user_id)
        else:
            message_label.config(
                text="Invalid username or password. Create an account first if you are new.",
                fg=ui_utils.DANGER,
            )

    ttk.Button(
        form_frame, text="Sign In", style="Primary.TButton", command=login,
    ).grid(row=7, column=0, columnspan=2, pady=(8, 0), sticky=EW)

    def go_signup():
        root.destroy()
        signup_screen()

    signup_link = Label(
        form_frame,
        text="Need an account? Create one",
        font=ui_utils.FONT_SMALL, fg=ui_utils.ACCENT, bg=ui_utils.CARD_COLOR,
        cursor="hand2",
    )
    signup_link.grid(row=8, column=0, columnspan=2, pady=(16, 0))
    signup_link.bind("<Button-1>", lambda e: go_signup())

    password_entry.bind("<Return>", lambda e: login())
    username_entry.bind("<Return>", lambda e: password_entry.focus())
    root.mainloop()
