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

class HeroRecorder:
    def __init__(self, root):
        self.root = root
        self.root.title("英雄事迹记录本")
        self.root.geometry("650x450")
        self.root.resizable(True, True)

        # 初始化数据库
        self.conn = sqlite3.connect("heroes.db")
        self.create_table()

        # 创建界面组件
        self.create_widgets()
        # 加载已有记录
        self.load_records()

    def create_table(self):
        """创建事迹表"""
        cursor = self.conn.cursor()
        cursor.execute('''
            CREATE TABLE IF NOT EXISTS hero_records (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                name TEXT NOT NULL,
                description TEXT NOT NULL,
                record_date TEXT NOT NULL
            )
        ''')
        self.conn.commit()

    def create_widgets(self):
        # 输入区域框架
        input_frame = ttk.LabelFrame(self.root, text="添加英雄事迹", padding=10)
        input_frame.pack(fill="x", padx=10, pady=5)

        # 姓名
        ttk.Label(input_frame, text="英雄姓名：").grid(row=0, column=0, sticky="w", pady=5)
        self.name_entry = ttk.Entry(input_frame, width=30)
        self.name_entry.grid(row=0, column=1, padx=5, pady=5, sticky="w")

        # 事迹描述
        ttk.Label(input_frame, text="事迹描述：").grid(row=1, column=0, sticky="w", pady=5)
        self.desc_text = tk.Text(input_frame, width=50, height=4)
        self.desc_text.grid(row=1, column=1, padx=5, pady=5, sticky="w")

        # 日期（默认今天，可修改）
        ttk.Label(input_frame, text="日期(YYYY-MM-DD)：").grid(row=2, column=0, sticky="w", pady=5)
        self.date_entry = ttk.Entry(input_frame, width=15)
        self.date_entry.insert(0, date.today().isoformat())
        self.date_entry.grid(row=2, column=1, padx=5, pady=5, sticky="w")

        # 按钮区域
        btn_frame = ttk.Frame(input_frame)
        btn_frame.grid(row=3, column=0, columnspan=2, pady=10)
        self.add_btn = ttk.Button(btn_frame, text="添 加", command=self.add_record)
        self.add_btn.pack(side="left", padx=5)
        self.clear_btn = ttk.Button(btn_frame, text="清空输入", command=self.clear_inputs)
        self.clear_btn.pack(side="left", padx=5)

        # 显示区域框架
        list_frame = ttk.LabelFrame(self.root, text="事迹列表", padding=10)
        list_frame.pack(fill="both", expand=True, padx=10, pady=5)

        # 树形表格
        columns = ("ID", "姓名", "事迹描述", "日期")
        self.tree = ttk.Treeview(list_frame, columns=columns, show="headings", height=10)
        self.tree.heading("ID", text="ID")
        self.tree.heading("姓名", text="姓名")
        self.tree.heading("事迹描述", text="事迹描述")
        self.tree.heading("日期", text="日期")

        self.tree.column("ID", width=40, anchor="center")
        self.tree.column("姓名", width=100)
        self.tree.column("事迹描述", width=300)
        self.tree.column("日期", width=100, anchor="center")

        # 滚动条
        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")

        # 删除按钮
        delete_btn = ttk.Button(list_frame, text="删除选中记录", command=self.delete_record)
        delete_btn.pack(side="bottom", pady=5)

    def load_records(self):
        """从数据库加载所有记录到表格"""
        for row in self.tree.get_children():
            self.tree.delete(row)

        cursor = self.conn.cursor()
        cursor.execute("SELECT id, name, description, record_date FROM hero_records ORDER BY id DESC")
        for record in cursor.fetchall():
            self.tree.insert("", "end", values=record)

    def add_record(self):
        """添加新记录"""
        name = self.name_entry.get().strip()
        description = self.desc_text.get("1.0", "end-1c").strip()
        record_date = self.date_entry.get().strip()

        if not name or not description:
            messagebox.showwarning("输入不完整", "请填写英雄姓名和事迹描述。")
            return

        # 简单验证日期格式（这里只检查是否为空）
        if not record_date:
            messagebox.showwarning("日期为空", "请输入日期。")
            return

        try:
            cursor = self.conn.cursor()
            cursor.execute(
                "INSERT INTO hero_records (name, description, record_date) VALUES (?, ?, ?)",
                (name, description, record_date)
            )
            self.conn.commit()
            messagebox.showinfo("成功", "英雄事迹已记录！")
            self.load_records()
            self.clear_inputs()
            # 日期重置为今天
            self.date_entry.delete(0, "end")
            self.date_entry.insert(0, date.today().isoformat())
        except Exception as e:
            messagebox.showerror("错误", f"添加失败：{str(e)}")

    def delete_record(self):
        """删除选中的记录"""
        selected = self.tree.selection()
        if not selected:
            messagebox.showwarning("未选择", "请先在列表中选择一条记录。")
            return

        if messagebox.askyesno("确认删除", "确定要删除该英雄事迹吗？"):
            item = self.tree.item(selected[0])
            record_id = item['values'][0]  # ID在第一列
            try:
                cursor = self.conn.cursor()
                cursor.execute("DELETE FROM hero_records WHERE id = ?", (record_id,))
                self.conn.commit()
                self.load_records()
                messagebox.showinfo("成功", "记录已删除。")
            except Exception as e:
                messagebox.showerror("错误", f"删除失败：{str(e)}")

    def clear_inputs(self):
        """清空姓名和描述输入框"""
        self.name_entry.delete(0, "end")
        self.desc_text.delete("1.0", "end")

    def __del__(self):
        """关闭数据库连接"""
        if hasattr(self, 'conn'):
            self.conn.close()

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