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

# 菜谱数据文件
DATA_FILE = "family_menu.json"

class FamilyCookBook:
    def __init__(self, root):
        self.root = root
        self.root.title("家庭电子菜谱")
        self.root.geometry("780x580")
        self.root.resizable(False, False)

        # 加载菜谱数据
        self.menu_list = self.load_data()

        # 构建界面布局
        self.create_widgets()
        self.refresh_listbox()

    # 读取本地json
    def load_data(self):
        if os.path.exists(DATA_FILE):
            try:
                with open(DATA_FILE, "r", encoding="utf-8") as f:
                    return json.load(f)
            except:
                return []
        return []

    # 保存数据到json
    def save_data(self):
        with open(DATA_FILE, "w", encoding="utf-8") as f:
            json.dump(self.menu_list, f, ensure_ascii=False, indent=2)

    def create_widgets(self):
        # 左右分割框架
        left_frame = tk.Frame(self.root, width=280)
        left_frame.pack(side=tk.LEFT, fill=tk.BOTH, padx=5, pady=5)

        right_frame = tk.Frame(self.root)
        right_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True, padx=5, pady=5)

        # =========左侧：菜谱列表与操作按钮=========
        tk.Label(left_frame, text="📖 菜谱列表", font=("微软雅黑",12,"bold")).pack()
        self.listbox = tk.Listbox(left_frame, font=("微软雅黑",10))
        self.listbox.pack(fill=tk.BOTH, expand=True)
        self.listbox.bind("<<ListboxSelect>>", self.show_detail)

        btn_frame = tk.Frame(left_frame)
        btn_frame.pack(fill=tk.X, pady=5)
        tk.Button(btn_frame, text="新增菜谱", command=self.add_window, width=8).grid(row=0,column=0,padx=2)
        tk.Button(btn_frame, text="删除菜谱", command=self.delete_menu, width=8).grid(row=0,column=1,padx=2)

        # =========右侧：菜谱详情区域=========
        tk.Label(right_frame, text="🍳 菜谱详情", font=("微软雅黑",12,"bold")).pack()

        detail_frame = tk.Frame(right_frame)
        detail_frame.pack(fill=tk.BOTH, expand=True)

        self.detail_text = scrolledtext.ScrolledText(detail_frame, font=("微软雅黑",10))
        self.detail_text.pack(fill=tk.BOTH, expand=True)

    # 刷新列表
    def refresh_listbox(self):
        self.listbox.delete(0, tk.END)
        for item in self.menu_list:
            self.listbox.insert(tk.END, item["name"])

    # 选中显示详情
    def show_detail(self, event):
        sel = self.listbox.curselection()
        if not sel:
            return
        idx = sel[0]
        data = self.menu_list[idx]
        text = f"""【菜名】{data['name']}
【分类】{data['category']}

【食材】
{data['material']}

【烹饪步骤】
{data['step']}
"""
        self.detail_text.delete(1.0, tk.END)
        self.detail_text.insert(tk.END, text)

    # 新增菜谱弹窗
    def add_window(self):
        win = tk.Toplevel(self.root)
        win.title("新增菜谱")
        win.geometry("460x420")
        win.transient(self.root)

        tk.Label(win, text="菜名：").place(x=20,y=15)
        name_var = tk.StringVar()
        tk.Entry(win, textvariable=name_var, width=35).place(x=80,y=15)

        tk.Label(win, text="分类：").place(x=20,y=50)
        cate_var = tk.StringVar()
        combo = ttk.Combobox(win, textvariable=cate_var, width=32, values=["家常菜","汤品","小吃","甜品","主食"])
        combo.place(x=80,y=50)
        combo.current(0)

        tk.Label(win, text="食材：").place(x=20,y=85)
        mat_text = scrolledtext.ScrolledText(win, width=42, height=6)
        mat_text.place(x=20,y=105)

        tk.Label(win, text="步骤：").place(x=20,y=220)
        step_text = scrolledtext.ScrolledText(win, width=42, height=6)
        step_text.place(x=20,y=240)

        def submit():
            name = name_var.get().strip()
            cate = cate_var.get().strip()
            mat = mat_text.get(1.0, tk.END).strip()
            step = step_text.get(1.0, tk.END).strip()
            if not name:
                messagebox.showwarning("提示","请填写菜名！")
                return
            new_item = {
                "name": name,
                "category": cate,
                "material": mat,
                "step": step
            }
            self.menu_list.append(new_item)
            self.save_data()
            self.refresh_listbox()
            messagebox.showinfo("成功","菜谱添加完成！")
            win.destroy()

        tk.Button(win, text="保存菜谱", command=submit, width=12, bg="#409EFF", fg="white").place(x=160,y=370)

    # 删除菜谱
    def delete_menu(self):
        sel = self.listbox.curselection()
        if not sel:
            messagebox.showinfo("提示","请先选中要删除的菜谱！")
            return
        idx = sel[0]
        name = self.menu_list[idx]["name"]
        if messagebox.askyesno("确认删除", f"确定要删除【{name}】吗？"):
            del self.menu_list[idx]
            self.save_data()
            self.refresh_listbox()
            self.detail_text.delete(1.0, tk.END)

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