"""Aplikasi tugas satu jendela; model berada di core.py."""
from pathlib import Path
import tkinter as tk
from tkinter import ttk, messagebox
import core


def build_window(root, path):
    rows = core.load(path)
    root.title("Pengatur Tugas Belajar")
    root.geometry("560x420")
    root.columnconfigure(0, weight=1)
    root.rowconfigure(3, weight=1)
    title = tk.StringVar(root)
    query = tk.StringVar(root)
    status = tk.StringVar(root)
    selected_ids = []
    ttk.Label(root, text="Judul tugas").grid(row=0, column=0, sticky="w", padx=12, pady=6)
    entry = ttk.Entry(root, textvariable=title)
    entry.grid(row=1, column=0, sticky="ew", padx=12)
    bar = ttk.Frame(root)
    bar.grid(row=2, column=0, sticky="ew", padx=12, pady=8)
    ttk.Entry(bar, textvariable=query, width=25).pack(side="left")
    listing = tk.Listbox(root)
    listing.grid(row=3, column=0, sticky="nsew", padx=12)
    actions = ttk.Frame(root)
    actions.grid(row=4, column=0, pady=10)
    ttk.Label(root, textvariable=status).grid(row=5, column=0, pady=8)

    def render():
        listing.delete(0, "end")
        selected_ids.clear()
        for row in core.search(rows, query.get()):
            selected_ids.append(row["id"])
            listing.insert("end", ("[x] " if row["done"] else "[ ] ") + row["title"])
        done, total = core.summary(rows)
        status.set(f"Selesai {done}/{total} · Simpan sebelum menutup aplikasi")

    def add():
        try:
            core.add(rows, title.get())
            title.set("")
            render()
        except ValueError as error:
            messagebox.showerror("Input tugas", str(error), parent=root)

    def complete():
        selection = listing.curselection()
        if not selection:
            status.set("Pilih satu tugas dahulu.")
            return
        core.complete(rows, selected_ids[selection[0]])
        render()

    def save():
        try:
            core.save(path, rows)
            status.set("Data tersimpan. Aplikasi dapat ditutup dan dibuka ulang.")
        except (ValueError, OSError) as error:
            messagebox.showerror("Simpan", str(error), parent=root)

    def reload():
        try:
            loaded = core.load(path)
            rows[:] = loaded
            render()
        except (ValueError, OSError) as error:
            messagebox.showerror("Muat: file dipertahankan", str(error), parent=root)

    buttons = {}
    for label, handler in [("Tambah", add), ("Selesai", complete), ("Simpan", save), ("Muat", reload)]:
        button = ttk.Button(actions, text=label, command=handler)
        button.pack(side="left", padx=3)
        buttons[label] = button
    ttk.Button(bar, text="Cari", command=render).pack(side="left", padx=6)
    render()
    return {"rows": rows, "title": title, "query": query, "list": listing,
            "buttons": buttons, "render": render, "status": status}


def main():
    root = tk.Tk()
    try:
        build_window(root, Path(__file__).with_name("tasks.json"))
    except (ValueError, OSError) as error:
        messagebox.showerror("Data tidak dibuka; file dipertahankan", str(error), parent=root)
        root.destroy()
        return
    root.mainloop()


if __name__ == "__main__":
    main()
