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

# 数据文件
DATA_FILE = "account_book.txt"

class AccountBook:
    def __init__(self, root):
        self.root = root
        self.root.title("简易记账本")
        self.root.geometry("1000x700")

        # 存储记录 [[日期,类型,金额,备注],...]
        self.records = []
        self.load_data()

        # ----顶部输入区----
        frame_input = tk.Frame(root, padx=5, pady=5)
        frame_input.pack(fill=tk.X)

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

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

        tk.Label(frame_input, text="备注:").grid(row=0, column=4)
        self.var_note = tk.StringVar()
        tk.Entry(frame_input, textvariable=self.var_note, width=25).grid(row=0, column=5, padx=5)

        tk.Button(frame_input, text="添加记录", command=self.add_record, bg="#4096ee", fg="white").grid(row=0, column=6, padx=8)

        # ----统计信息区----
        frame_stat = tk.Frame(root, padx=5, pady=5)
        frame_stat.pack(fill=tk.X)
        self.txt_income = tk.Label(frame_stat, text="总收入：0.00元", fg="green")
        self.txt_income.pack(side=tk.LEFT, padx=10)
        self.txt_outcome = tk.Label(frame_stat, text="总支出：0.00元", fg="red")
        self.txt_outcome.pack(side=tk.LEFT, padx=10)
        self.txt_balance = tk.Label(frame_stat, text="当前结余：0.00元", fg="blue")
        self.txt_balance.pack(side=tk.LEFT, padx=10)

        # ----列表表格区----
        frame_table = tk.Frame(root)
        frame_table.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)
        columns = ("date", "type", "money", "note")
        self.tree = ttk.Treeview(frame_table, columns=columns, show="headings")
        self.tree.heading("date", text="日期")
        self.tree.heading("type", text="类型")
        self.tree.heading("money", text="金额(元)")
        self.tree.heading("note", text="备注")
        self.tree.column("date", width=140)
        self.tree.column("type", width=70)
        self.tree.column("money", width=100)
        self.tree.column("note", width=260)

        scroll = ttk.Scrollbar(frame_table, orient=tk.VERTICAL, command=self.tree.yview)
        self.tree.configure(yscrollcommand=scroll.set)
        self.tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
        scroll.pack(side=tk.RIGHT, fill=tk.Y)

        # ----底部按钮----
        frame_bottom = tk.Frame(root, pady=5)
        frame_bottom.pack()
        tk.Button(frame_bottom, text="删除选中记录", command=self.del_record, bg="#ee5555", fg="white").pack()

        self.refresh_ui()

    def load_data(self):
        """从文件读取历史记账数据"""
        if not os.path.exists(DATA_FILE):
            return
        with open(DATA_FILE, "r", encoding="utf-8") as f:
            for line in f:
                line = line.strip()
                if not line:
                    continue
                parts = line.split("|")
                if len(parts) == 4:
                    self.records.append(parts)

    def save_data(self):
        """保存数据到文件"""
        with open(DATA_FILE, "w", encoding="utf-8") as f:
            for r in self.records:
                f.write("|".join(r)+"\n")

    def add_record(self):
        money_str = self.var_money.get().strip()
        note = self.var_note.get().strip()
        r_type = self.type_var.get()
        try:
            money = float(money_str)
            if money <= 0:
                messagebox.showerror("错误", "金额必须大于0！")
                return
        except ValueError:
            messagebox.showerror("错误", "请输入合法数字金额！")
            return

        now = datetime.now().strftime("%Y-%m-%d %H:%M")
        new_item = [now, r_type, f"{money:.2f}", note]
        self.records.append(new_item)
        self.save_data()
        #清空输入框
        self.var_money.set("")
        self.var_note.set("")
        self.refresh_ui()

    def del_record(self):
        selected = self.tree.selection()
        if not selected:
            messagebox.showwarning("提示", "请先选中一条记录")
            return
        index = self.tree.index(selected[0])
        del self.records[index]
        self.save_data()
        self.refresh_ui()

    def refresh_ui(self):
        #清空表格
        for item in self.tree.get_children():
            self.tree.delete(item)
        #重新插入所有记录
        income = 0.0
        outcome = 0.0
        for row in self.records:
            self.tree.insert("", tk.END, values=row)
            t, m = row[1], float(row[2])
            if t == "收入":
                income += m
            else:
                outcome += m
        balance = income - outcome
        self.txt_income.config(text=f"总收入：{income:.2f}元")
        self.txt_outcome.config(text=f"总支出：{outcome:.2f}元")
        self.txt_balance.config(text=f"当前结余：{balance:.2f}元")


if __name__ == "__main__":
    win = tk.Tk()
    app = AccountBook(win)
    win.mainloop()

