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

# ----------------------数据库初始化----------------------
def init_db():
    conn = sqlite3.connect("hero_record.db")
    cursor = conn.cursor()
    cursor.execute('''
    CREATE TABLE IF NOT EXISTS heroes (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        title TEXT,
        story TEXT,
        birth TEXT,
        contribution TEXT,
        create_time TEXT
    )
    ''')
    conn.commit()
    conn.close()

# ----------------------主程序窗口----------------------
class HeroApp:
    def __init__(self, root):
        self.root = root
        self.root.title("英雄事迹记录管理系统")
        self.root.geometry("950x620")

        # 变量
        self.selected_id = None

        # 顶部输入区
        frame_input = ttk.LabelFrame(root, text="英雄信息录入")
        frame_input.place(x=10, y=10, width=925, height=220)

        ttk.Label(frame_input, text="姓名：").place(x=15, y=15)
        self.var_name = tk.StringVar()
        ttk.Entry(frame_input, textvariable=self.var_name, width=25).place(x=70, y=15)

        ttk.Label(frame_input, text="称号：").place(x=280, y=15)
        self.var_title = tk.StringVar()
        ttk.Entry(frame_input, textvariable=self.var_title, width=25).place(x=335, y=15)

        ttk.Label(frame_input, text="生卒年份：").place(x=545, y=15)
        self.var_birth = tk.StringVar()
        ttk.Entry(frame_input, textvariable=self.var_birth, width=25).place(x=620, y=15)

        ttk.Label(frame_input, text="主要贡献：").place(x=15, y=50)
        self.var_contribution = tk.StringVar()
        ttk.Entry(frame_input, textvariable=self.var_contribution, width=85).place(x=80, y=50)

        ttk.Label(frame_input, text="英雄事迹详情：").place(x=15, y=85)
        self.text_story = tk.Text(frame_input, width=105, height=6)
        self.text_story.place(x=15, y=105)

        # 按钮区
        frame_btn = ttk.Frame(root)
        frame_btn.place(x=10, y=240, width=925, height=40)
        ttk.Button(frame_btn, text="新增记录", command=self.add_record).place(x=20, y=5)
        ttk.Button(frame_btn, text="修改选中", command=self.edit_record).place(x=130, y=5)
        ttk.Button(frame_btn, text="删除选中", command=self.delete_record).place(x=240, y=5)
        ttk.Button(frame_btn, text="清空输入框", command=self.clear_input).place(x=350, y=5)
        ttk.Button(frame_btn, text="导出选中事迹", command=self.export_txt).place(x=480, y=5)

        # 搜索区
        ttk.Label(root, text="搜索英雄姓名：").place(x=10, y=288)
        self.var_search = tk.StringVar()
        ttk.Entry(root, textvariable=self.var_search, width=30).place(x=110, y=288)
        ttk.Button(root, text="搜索", command=self.search_data).place(x=350, y=285)
        ttk.Button(root, text="显示全部", command=self.load_all_data).place(x=420, y=285)

        # 表格列表
        frame_table = ttk.LabelFrame(root, text="英雄事迹列表(点击一行查看详情)")
        frame_table.place(x=10, y=320, width=925, height=280)

        columns = ("id", "name", "title", "birth", "contribution")
        self.tree = ttk.Treeview(frame_table, columns=columns, show="headings")
        self.tree.heading("id", text="编号")
        self.tree.heading("name", text="姓名")
        self.tree.heading("title", text="称号")
        self.tree.heading("birth", text="生卒")
        self.tree.heading("contribution", text="主要贡献")

        self.tree.column("id", width=50)
        self.tree.column("name", width=120)
        self.tree.column("title", width=180)
        self.tree.column("birth", width=150)
        self.tree.column("contribution", width=380)

        scrollbar = ttk.Scrollbar(frame_table, orient=tk.VERTICAL, command=self.tree.yview)
        self.tree.configure(yscrollcommand=scrollbar.set)
        self.tree.place(x=5, y=5, width=880, height=245)
        scrollbar.place(x=885, y=5, height=245)

        # 选中事件
        self.tree.bind("<<TreeviewSelect>>", self.on_select_row)

        self.load_all_data()

    # 加载全部数据
    def load_all_data(self):
        for item in self.tree.get_children():
            self.tree.delete(item)
        conn = sqlite3.connect("hero_record.db")
        cur = conn.cursor()
        cur.execute("SELECT id,name,title,birth,contribution FROM heroes ORDER BY id DESC")
        rows = cur.fetchall()
        for r in rows:
            self.tree.insert("", tk.END, values=r)
        conn.close()

    # 搜索
    def search_data(self):
        keyword = self.var_search.get().strip()
        if not keyword:
            messagebox.showwarning("提示", "请输入搜索关键词")
            return
        for item in self.tree.get_children():
            self.tree.delete(item)
        conn = sqlite3.connect("hero_record.db")
        cur = conn.cursor()
        cur.execute("SELECT id,name,title,birth,contribution FROM heroes WHERE name LIKE ?", ('%'+keyword+'%',))
        rows = cur.fetchall()
        for r in rows:
            self.tree.insert("", tk.END, values=r)
        conn.close()

    # 选中表格行
    def on_select_row(self, event):
        selected = self.tree.selection()
        if not selected:
            return
        row = self.tree.item(selected[0])["values"]
        self.selected_id = row[0]
        conn = sqlite3.connect("hero_record.db")
        cur = conn.cursor()
        cur.execute("SELECT * FROM heroes WHERE id=?", (self.selected_id,))
        data = cur.fetchone()
        conn.close()
        #回填数据
        self.var_name.set(data[1])
        self.var_title.set(data[2])
        self.text_story.delete(1.0, tk.END)
        self.text_story.insert(tk.END, data[3])
        self.var_birth.set(data[4])
        self.var_contribution.set(data[5])

    #新增
    def add_record(self):
        name = self.var_name.get().strip()
        title = self.var_title.get().strip()
        story = self.text_story.get(1.0, tk.END).strip()
        birth = self.var_birth.get().strip()
        con = self.var_contribution.get().strip()
        if not name:
            messagebox.showerror("错误","英雄姓名不能为空！")
            return
        now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        conn = sqlite3.connect("hero_record.db")
        cur = conn.cursor()
        cur.execute('INSERT INTO heroes(name,title,story,birth,contribution,create_time) VALUES(?,?,?,?,?,?)',
                    (name,title,story,birth,con,now))
        conn.commit()
        conn.close()
        messagebox.showinfo("成功","记录添加完成！")
        self.clear_input()
        self.load_all_data()

    #修改
    def edit_record(self):
        if self.selected_id is None:
            messagebox.showwarning("提示","请先在列表选中一条记录")
            return
        name = self.var_name.get().strip()
        title = self.var_title.get().strip()
        story = self.text_story.get(1.0, tk.END).strip()
        birth = self.var_birth.get().strip()
        con = self.var_contribution.get().strip()
        if not name:
            messagebox.showerror("错误","英雄姓名不能为空！")
            return
        conn = sqlite3.connect("hero_record.db")
        cur = conn.cursor()
        cur.execute('''UPDATE heroes SET name=?,title=?,story=?,birth=?,contribution=? WHERE id=?''',
                    (name,title,story,birth,con,self.selected_id))
        conn.commit()
        conn.close()
        messagebox.showinfo("成功","记录已更新")
        self.clear_input()
        self.load_all_data()
        self.selected_id = None

    #删除
    def delete_record(self):
        if self.selected_id is None:
            messagebox.showwarning("提示","请先选中记录")
            return
        ok = messagebox.askyesno("确认删除","确定要删除这条英雄事迹记录吗？")
        if ok:
            conn = sqlite3.connect("hero_record.db")
            cur = conn.cursor()
            cur.execute("DELETE FROM heroes WHERE id=?", (self.selected_id,))
            conn.commit()
            conn.close()
            self.clear_input()
            self.load_all_data()
            self.selected_id = None

    #清空输入框
    def clear_input(self):
        self.var_name.set("")
        self.var_title.set("")
        self.var_birth.set("")
        self.var_contribution.set("")
        self.text_story.delete(1.0, tk.END)
        self.selected_id = None

    #导出为txt文档
    def export_txt(self):
        if self.selected_id is None:
            messagebox.showwarning("提示","请先选中一条记录导出")
            return
        conn = sqlite3.connect("hero_record.db")
        cur = conn.cursor()
        cur.execute("SELECT * FROM heroes WHERE id=?", (self.selected_id,))
        data = cur.fetchone()
        conn.close()
        save_path = filedialog.asksaveasfilename(defaultextension=".txt",
                                                  filetypes=[("文本文件","*.txt")],
                                                  initialfile=f"{data[1]}_英雄事迹.txt")
        if save_path:
            content=f"""英雄姓名：{data[1]}
称号：{data[2]}
生卒年份：{data[4]}
主要贡献：{data[5]}
事迹详情：
{data[3]}
录入时间：{data[6]}
"""
            with open(save_path,"w",encoding="utf-8") as f:
                f.write(content)
            messagebox.showinfo("导出成功",f"文件已保存到：{save_path}")


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