import os
import json
from datetime import datetime
import tkinter as tk
from tkinter import ttk, messagebox

DATA_FILE = "account_data.json"


def load_records():
    if os.path.exists(DATA_FILE):
        with open(DATA_FILE, "r", encoding="utf-8") as f:
            return json.load(f)
    return []


def save_records(records):
    with open(DATA_FILE, "w", encoding="utf-8") as f:
        json.dump(records, f, ensure_ascii=False, indent=2)


class AccountBookApp:
    def __init__(self, root):
        self.root = root
        self.root.title("📒 记账本")
        self.root.geometry("600x500")
        self.root.resizable(False, False)

        self.records = load_records()

        self.setup_ui()
        self.refresh_list()

    def setup_ui(self):
        # ===== 输入区 =====
        input_frame = ttk.LabelFrame(self.root, text="添加记录", padding=10)
        input_frame.pack(fill="x", padx=10, pady=8)

        ttk.Label(input_frame, text="类型:").grid(row=0, column=0, padx=5, pady=5)
        self.type_var = tk.StringVar(value="支出")
        type_combo = ttk.Combobox(
            input_frame, textvariable=self.type_var,
            values=["收入", "支出"], width=8, state="readonly"
        )
        type_combo.grid(row=0, column=1, padx=5)

        ttk.Label(input_frame, text="金额:").grid(row=0, column=2, padx=5)
        self.amount_var = tk.StringVar()
        ttk.Entry(input_frame, textvariable=self.amount_var, width=12).grid(row=0, column=3, padx=5)

        ttk.Label(input_frame, text="备注:").grid(row=0, column=4, padx=5)
        self.note_var = tk.StringVar()
        ttk.Entry(input_frame, textvariable=self.note_var, width=16).grid(row=0, column=5, padx=5)

        ttk.Button(input_frame, text="➕ 添加", command=self.add_record).grid(row=0, column=6, padx=10)

        # ===== 统计区 =====
        self.summary_var = tk.StringVar()
        summary_label = ttk.Label(
            self.root, textvariable=self.summary_var,
            font=("", 11, "bold"), foreground="#2a7"
        )
        summary_label.pack(pady=5)
        self.refresh_summary()

        # ===== 列表区 =====
        list_frame = ttk.LabelFrame(self.root, text="账目明细", padding=10)
        list_frame.pack(fill="both", expand=True, padx=10, pady=8)

        columns = ("date", "type", "amount", "note")
        self.tree = ttk.Treeview(list_frame, columns=columns, show="headings", height=13)
        self.tree.heading("date", text="日期")
        self.tree.heading("type", text="类型")
        self.tree.heading("amount", text="金额")
        self.tree.heading("note", text="备注")
        self.tree.column("date", width=150)
        self.tree.column("type", width=80)
        self.tree.column("amount", width=100)
        self.tree.column("note", width=180)

        scrollbar = ttk.Scrollbar(list_frame, orient="vertical", command=self.tree.yview)
        self.tree.configure(yscrollcommand=scrollbar.set)
        self.tree.pack(side="left", fill="both", expand=True)
        scrollbar.pack(side="right", fill="y")

        ttk.Button(
            self.root, text="🗑️ 删除选中记录", command=self.delete_record
        ).pack(pady=5)

    def add_record(self):
        r_type = self.type_var.get()
        try:
            amount = float(self.amount_var.get())
            if amount <= 0:
                raise ValueError
        except ValueError:
            messagebox.showerror("错误", "请输入有效的正数金额")
            return

        note = self.note_var.get().strip()

        record = {
            "date": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
            "type": r_type,
            "amount": amount,
            "note": note,
        }
        self.records.append(record)
        save_records(self.records)

        self.amount_var.set("")
        self.note_var.set("")
        self.refresh_list()
        self.refresh_summary()
        messagebox.showinfo("成功", "记录已添加 ✅")

    def delete_record(self):
        selected = self.tree.selection()
        if not selected:
            messagebox.showwarning("提示", "请先选择要删除的记录")
            return
        if not messagebox.askyesno("确认", "确定要删除这条记录吗？"):
            return

        # 通过 iid 与 records 索引对应删除
        indexes = [int(iid) for iid in selected]
        for idx in sorted(indexes, reverse=True):
            del self.records[idx]
        save_records(self.records)
        self.refresh_list()
        self.refresh_summary()

    def refresh_list(self):
        self.tree.delete(*self.tree.get_children())
        for idx, r in enumerate(self.records):
            self.tree.insert(
                "", "end", iid=str(idx),
                values=(r["date"], r["type"], f"{r['amount']:.2f}", r["note"])
            )

    def refresh_summary(self):
        income = sum(r["amount"] for r in self.records if r["type"] == "收入")
        expense = sum(r["amount"] for r in self.records if r["type"] == "支出")
        balance = income - expense
        self.summary_var.set(
            f"总收入: {income:.2f} 元   总支出: {expense:.2f} 元   "
            f"💰 当前余额: {balance:.2f} 元"
        )


if __name__ == "__main__":
    root = tk.Tk()
    app = AccountBookApp(root)
    root.mainloop()
