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

class SimpleAccountBook:
    def __init__(self, root):
        self.root = root
        self.root.title("简易记账本")
        self.root.geometry("600x500")
        self.root.resizable(True, True)

        # 数据存储：每条记录为 (日期, 类型, 金额, 备注)
        self.records = []

        self.setup_ui()
        self.update_display()

    def setup_ui(self):
        # 顶部输入区域
        input_frame = ttk.LabelFrame(self.root, text="添加记录", padding=10)
        input_frame.pack(fill=tk.X, padx=10, pady=5)

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

        # 金额输入
        ttk.Label(input_frame, text="金额:").grid(row=0, column=2, padx=5, pady=5, sticky=tk.W)
        self.amount_var = tk.StringVar()
        amount_entry = ttk.Entry(input_frame, textvariable=self.amount_var, width=15)
        amount_entry.grid(row=0, column=3, padx=5, pady=5, sticky=tk.W)

        # 备注输入
        ttk.Label(input_frame, text="备注:").grid(row=0, column=4, padx=5, pady=5, sticky=tk.W)
        self.note_var = tk.StringVar()
        note_entry = ttk.Entry(input_frame, textvariable=self.note_var, width=25)
        note_entry.grid(row=0, column=5, padx=5, pady=5, sticky=tk.W)

        # 添加按钮
        add_btn = ttk.Button(input_frame, text="添加", command=self.add_record)
        add_btn.grid(row=0, column=6, padx=10, pady=5)

        # 中部显示区域
        display_frame = ttk.LabelFrame(self.root, text="收支记录", padding=10)
        display_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=5)

        # 表格（Treeview）
        columns = ("date", "type", "amount", "note")
        self.tree = ttk.Treeview(display_frame, columns=columns, show="headings", height=15)
        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=120)
        self.tree.column("type", width=80)
        self.tree.column("amount", width=100)
        self.tree.column("note", width=200)

        # 滚动条
        scrollbar = ttk.Scrollbar(display_frame, orient=tk.VERTICAL, command=self.tree.yview)
        self.tree.configure(yscrollcommand=scrollbar.set)

        self.tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)

        # 底部操作区域
        bottom_frame = ttk.Frame(self.root, padding=10)
        bottom_frame.pack(fill=tk.X, padx=10, pady=5)

        # 余额显示
        self.balance_label = ttk.Label(bottom_frame, text="当前余额: ¥0.00", font=("Microsoft YaHei", 12, "bold"))
        self.balance_label.pack(side=tk.LEFT, padx=10)

        # 删除按钮
        delete_btn = ttk.Button(bottom_frame, text="删除选中记录", command=self.delete_record)
        delete_btn.pack(side=tk.RIGHT, padx=10)

    def add_record(self):
        """添加一条新记录"""
        type_ = self.type_var.get()
        amount_str = self.amount_var.get().strip()
        note = self.note_var.get().strip()

        # 验证金额
        if not amount_str:
            messagebox.showwarning("输入错误", "请输入金额")
            return
        try:
            amount = float(amount_str)
            if amount <= 0:
                messagebox.showwarning("输入错误", "金额必须大于0")
                return
        except ValueError:
            messagebox.showwarning("输入错误", "金额必须是数字")
            return

        # 获取当前日期
        date_str = datetime.now().strftime("%Y-%m-%d %H:%M")

        # 添加到记录列表
        self.records.append((date_str, type_, amount, note))

        # 清空输入
        self.amount_var.set("")
        self.note_var.set("")

        # 更新显示
        self.update_display()

    def delete_record(self):
        """删除选中的记录"""
        selected = self.tree.selection()
        if not selected:
            messagebox.showinfo("提示", "请先选择一条记录")
            return

        # 获取选中项的索引（通过查找记录中的唯一信息）
        item = self.tree.item(selected[0])
        values = item["values"]
        if not values:
            return

        # 通过日期、类型、金额、备注匹配记录
        date_str, type_, amount, note = values
        amount = float(amount)  # 转换回浮点数

        # 从列表中移除
        record_to_remove = None
        for rec in self.records:
            if rec[0] == date_str and rec[1] == type_ and rec[2] == amount and rec[3] == note:
                record_to_remove = rec
                break

        if record_to_remove:
            self.records.remove(record_to_remove)
            self.update_display()

    def update_display(self):
        """刷新表格和余额"""
        # 清空表格
        for item in self.tree.get_children():
            self.tree.delete(item)

        # 插入所有记录
        for rec in self.records:
            date_str, type_, amount, note = rec
            # 金额显示格式
            amount_display = f"¥{amount:.2f}"
            self.tree.insert("", tk.END, values=(date_str, type_, amount_display, note))

        # 计算余额
        balance = 0.0
        for rec in self.records:
            type_ = rec[1]
            amount = rec[2]
            if type_ == "收入":
                balance += amount
            else:  # 支出
                balance -= amount

        self.balance_label.config(text=f"当前余额: ¥{balance:.2f}")

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