import tkinter as tk
from tkinter import ttk, messagebox, filedialog, scrolledtext
import json
import os
from datetime import datetime
import random

class Recipe:
    """菜谱类"""
    def __init__(self, name, category, ingredients, steps, tags=None, rating=0, 
                 cooking_time=30, difficulty="中等", image_path=None):
        self.name = name
        self.category = category  # 川菜、粤菜、鲁菜等
        self.ingredients = ingredients  # 列表
        self.steps = steps  # 列表
        self.tags = tags or []  # 标签
        self.rating = rating  # 评分 0-5
        self.cooking_time = cooking_time  # 分钟
        self.difficulty = difficulty  # 简单、中等、困难
        self.image_path = image_path
        self.created_date = datetime.now().strftime("%Y-%m-%d")
        self.favorite = False
        
    def to_dict(self):
        """转换为字典"""
        return {
            'name': self.name,
            'category': self.category,
            'ingredients': self.ingredients,
            'steps': self.steps,
            'tags': self.tags,
            'rating': self.rating,
            'cooking_time': self.cooking_time,
            'difficulty': self.difficulty,
            'image_path': self.image_path,
            'created_date': self.created_date,
            'favorite': self.favorite
        }
    
    @classmethod
    def from_dict(cls, data):
        """从字典创建对象"""
        recipe = cls(
            data['name'],
            data['category'],
            data['ingredients'],
            data['steps'],
            data.get('tags', []),
            data.get('rating', 0),
            data.get('cooking_time', 30),
            data.get('difficulty', '中等'),
            data.get('image_path')
        )
        recipe.created_date = data.get('created_date', datetime.now().strftime("%Y-%m-%d"))
        recipe.favorite = data.get('favorite', False)
        return recipe

class RecipeApp:
    def __init__(self):
        self.root = tk.Tk()
        self.root.title("🏠 家庭电子菜谱")
        self.root.geometry("1200x700")
        self.root.configure(bg='#f0f0f0')
        
        # 数据文件
        self.data_file = 'recipes.json'
        self.recipes = []
        self.current_recipe = None
        
        # 加载数据
        self.load_recipes()
        
        # 设置UI
        self.setup_ui()
        
        # 更新显示
        self.refresh_recipe_list()
        
        # 设置窗口关闭事件
        self.root.protocol("WM_DELETE_WINDOW", self.on_closing)
    
    def setup_ui(self):
        """设置用户界面"""
        # 顶部标题
        title_frame = tk.Frame(self.root, bg='#2c3e50', height=80)
        title_frame.pack(fill=tk.X)
        title_frame.pack_propagate(False)
        
        title_label = tk.Label(
            title_frame,
            text="🍳 家庭电子菜谱",
            font=('Arial', 28, 'bold'),
            bg='#2c3e50',
            fg='white'
        )
        title_label.pack(pady=15)
        
        # 主内容框架
        main_frame = tk.Frame(self.root, bg='#f0f0f0')
        main_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
        
        # 左侧面板 - 菜谱列表
        left_frame = tk.Frame(main_frame, bg='white', relief=tk.RAISED, bd=2)
        left_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True, padx=(0, 5))
        
        # 搜索框
        search_frame = tk.Frame(left_frame, bg='white')
        search_frame.pack(fill=tk.X, padx=10, pady=10)
        
        tk.Label(
            search_frame,
            text="🔍 搜索:",
            font=('Arial', 11),
            bg='white'
        ).pack(side=tk.LEFT)
        
        self.search_var = tk.StringVar()
        self.search_var.trace('w', lambda *args: self.filter_recipes())
        search_entry = tk.Entry(
            search_frame,
            textvariable=self.search_var,
            font=('Arial', 11),
            width=20
        )
        search_entry.pack(side=tk.LEFT, padx=5)
        
        # 分类筛选
        tk.Label(
            search_frame,
            text="分类:",
            font=('Arial', 11),
            bg='white'
        ).pack(side=tk.LEFT, padx=(10, 5))
        
        self.category_var = tk.StringVar(value="全部")
        category_combo = ttk.Combobox(
            search_frame,
            textvariable=self.category_var,
            values=["全部", "川菜", "粤菜", "鲁菜", "苏菜", "浙菜", "闽菜", 
                   "湘菜", "徽菜", "家常菜", "西餐", "甜点", "饮品", "其他"],
            width=10,
            state='readonly'
        )
        category_combo.pack(side=tk.LEFT)
        category_combo.bind('<<ComboboxSelected>>', lambda e: self.filter_recipes())
        
        # 菜谱列表
        list_frame = tk.Frame(left_frame, bg='white')
        list_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=(0, 10))
        
        # 创建Treeview
        columns = ('名称', '分类', '难度', '时间', '评分')
        self.recipe_tree = ttk.Treeview(list_frame, columns=columns, show='headings', height=20)
        
        # 设置列
        self.recipe_tree.heading('名称', text='📝 菜谱名称')
        self.recipe_tree.heading('分类', text='📂 分类')
        self.recipe_tree.heading('难度', text='📊 难度')
        self.recipe_tree.heading('时间', text='⏱️ 时间')
        self.recipe_tree.heading('评分', text='⭐ 评分')
        
        self.recipe_tree.column('名称', width=200)
        self.recipe_tree.column('分类', width=100)
        self.recipe_tree.column('难度', width=80)
        self.recipe_tree.column('时间', width=80)
        self.recipe_tree.column('评分', width=80)
        
        # 滚动条
        scrollbar = ttk.Scrollbar(list_frame, orient=tk.VERTICAL, command=self.recipe_tree.yview)
        self.recipe_tree.configure(yscrollcommand=scrollbar.set)
        
        self.recipe_tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
        
        # 绑定选择事件
        self.recipe_tree.bind('<<TreeviewSelect>>', self.on_recipe_select)
        self.recipe_tree.bind('<Double-Button-1>', self.on_recipe_double_click)
        
        # 右侧面板 - 菜谱详情
        right_frame = tk.Frame(main_frame, bg='white', relief=tk.RAISED, bd=2, width=600)
        right_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True, padx=(5, 0))
        right_frame.pack_propagate(False)
        
        # 菜谱详情标题
        self.detail_title = tk.Label(
            right_frame,
            text="选择一道菜谱查看详情",
            font=('Arial', 18, 'bold'),
            bg='white',
            fg='#2c3e50'
        )
        self.detail_title.pack(pady=15)
        
        # 详情内容框架（可滚动）
        detail_scroll = scrolledtext.ScrolledText(
            right_frame,
            wrap=tk.WORD,
            font=('Arial', 11),
            bg='#fafafa',
            height=25,
            state=tk.DISABLED
        )
        detail_scroll.pack(fill=tk.BOTH, expand=True, padx=15, pady=(0, 10))
        self.detail_text = detail_scroll
        
        # 按钮框架
        button_frame = tk.Frame(right_frame, bg='white')
        button_frame.pack(fill=tk.X, padx=15, pady=(0, 15))
        
        # 操作按钮
        btn_style = {'font': ('Arial', 10, 'bold'), 'width': 12, 'height': 1}
        
        tk.Button(
            button_frame,
            text="➕ 添加菜谱",
            command=self.add_recipe,
            bg='#3498db',
            fg='white',
            **btn_style
        ).pack(side=tk.LEFT, padx=5)
        
        tk.Button(
            button_frame,
            text="✏️ 编辑菜谱",
            command=self.edit_recipe,
            bg='#f39c12',
            fg='white',
            **btn_style
        ).pack(side=tk.LEFT, padx=5)
        
        tk.Button(
            button_frame,
            text="🗑️ 删除菜谱",
            command=self.delete_recipe,
            bg='#e74c3c',
            fg='white',
            **btn_style
        ).pack(side=tk.LEFT, padx=5)
        
        tk.Button(
            button_frame,
            text="⭐ 收藏",
            command=self.toggle_favorite,
            bg='#f1c40f',
            fg='black',
            **btn_style
        ).pack(side=tk.LEFT, padx=5)
        
        tk.Button(
            button_frame,
            text="🎲 随机推荐",
            command=self.random_recipe,
            bg='#9b59b6',
            fg='white',
            **btn_style
        ).pack(side=tk.LEFT, padx=5)
        
        tk.Button(
            button_frame,
            text="💾 导出数据",
            command=self.export_data,
            bg='#27ae60',
            fg='white',
            **btn_style
        ).pack(side=tk.LEFT, padx=5)
    
    def load_recipes(self):
        """加载菜谱数据"""
        if os.path.exists(self.data_file):
            try:
                with open(self.data_file, 'r', encoding='utf-8') as f:
                    data = json.load(f)
                    self.recipes = [Recipe.from_dict(item) for item in data]
            except:
                self.recipes = []
        
        # 如果没有数据，添加示例菜谱
        if not self.recipes:
            self.add_sample_recipes()
    
    def add_sample_recipes(self):
        """添加示例菜谱"""
        sample_recipes = [
            Recipe(
                "麻婆豆腐",
                "川菜",
                ["豆腐 1块", "牛肉末 50g", "豆瓣酱 2汤匙", "花椒 1汤匙", 
                 "蒜末 1汤匙", "姜末 1汤匙", "葱花 适量", "生抽 1汤匙", 
                 "料酒 1汤匙", "淀粉 1汤匙", "食用油 适量"],
                ["豆腐切小块，用开水焯一下去腥", "锅中热油，炒香花椒后捞出", 
                 "放入牛肉末炒至变色", "加入豆瓣酱、蒜末、姜末炒出红油", 
                 "加入适量水，放入豆腐块", "加入生抽、料酒调味", 
                 "水淀粉勾芡，撒上葱花即可"],
                ["麻辣", "下饭"],
                4,
                25,
                "中等"
            ),
            Recipe(
                "宫保鸡丁",
                "川菜",
                ["鸡胸肉 300g", "花生米 50g", "干辣椒 10g", "花椒 5g",
                 "葱段 适量", "姜片 适量", "蒜片 适量", "生抽 2汤匙",
                 "料酒 1汤匙", "糖 1汤匙", "醋 1汤匙", "淀粉 1汤匙"],
                ["鸡胸肉切丁，用料酒、淀粉腌制15分钟", "调汁：生抽、糖、醋、水混合",
                 "锅中倒油，炸花生米至金黄捞出", "爆香干辣椒、花椒、姜蒜",
                 "放入鸡丁翻炒至变色", "倒入调好的汁，翻炒均匀",
                 "加入花生米和葱段，快速翻炒出锅"],
                ["下饭", "家常"],
                5,
                30,
                "中等"
            ),
            Recipe(
                "清蒸鲈鱼",
                "粤菜",
                ["鲈鱼 1条", "姜片 适量", "葱段 适量", "蒸鱼豉油 2汤匙",
                 "料酒 1汤匙", "食用油 2汤匙", "香菜 适量"],
                ["鱼洗净，在鱼身划几刀", "鱼身抹料酒，放上姜片和葱段",
                 "蒸锅水开后，放入鱼蒸8-10分钟", "取出倒掉汤汁，去掉姜葱",
                 "重新放上葱丝，淋上蒸鱼豉油", "锅中烧热油，浇在鱼身上",
                 "撒上香菜即可"],
                ["清淡", "健康"],
                5,
                20,
                "简单"
            ),
            Recipe(
                "红烧肉",
                "家常菜",
                ["五花肉 500g", "冰糖 50g", "姜片 适量", "葱段 适量",
                 "八角 2个", "桂皮 1块", "生抽 2汤匙", "老抽 1汤匙",
                 "料酒 2汤匙", "盐 适量"],
                ["五花肉切块，冷水下锅煮开去血水", "锅中加少量油，放入冰糖炒至焦糖色",
                 "放入五花肉翻炒上色", "加入姜葱、八角、桂皮炒香",
                 "加入生抽、老抽、料酒和没过肉的热水", "大火烧开转小火炖40分钟",
                 "大火收汁，加盐调味即可"],
                ["家常", "下饭"],
                4,
                60,
                "中等"
            ),
            Recipe(
                "西红柿炒蛋",
                "家常菜",
                ["鸡蛋 3个", "西红柿 2个", "葱花 适量", "盐 适量",
                 "糖 少许", "食用油 适量"],
                ["鸡蛋打散，加少许盐搅拌均匀", "西红柿切块", "锅中热油，倒入蛋液炒至凝固盛出",
                 "锅中再加油，放入西红柿翻炒至软", "加入炒好的鸡蛋，翻炒均匀",
                 "加盐和少许糖调味，撒上葱花即可"],
                ["简单", "快手"],
                4,
                15,
                "简单"
            ),
            Recipe(
                "水煮鱼",
                "川菜",
                ["草鱼 1条", "黄豆芽 200g", "干辣椒 50g", "花椒 20g",
                 "姜片 适量", "蒜末 适量", "豆瓣酱 3汤匙", "生抽 2汤匙",
                 "料酒 2汤匙", "淀粉 适量", "鸡蛋清 1个"],
                ["鱼肉切片，用料酒、淀粉、蛋清腌制", "锅中煮开水，烫熟豆芽铺在碗底",
                 "锅中倒油，炒香豆瓣酱、姜蒜", "加入适量水煮开，放入鱼片滑熟",
                 "将鱼片和汤倒入豆芽碗中", "撒上干辣椒和花椒", "烧热油浇在辣椒上即可"],
                ["麻辣", "宴客"],
                5,
                40,
                "困难"
            )
        ]
        
        self.recipes.extend(sample_recipes)
        self.save_recipes()
    
    def save_recipes(self):
        """保存菜谱数据"""
        try:
            data = [recipe.to_dict() for recipe in self.recipes]
            with open(self.data_file, 'w', encoding='utf-8') as f:
                json.dump(data, f, ensure_ascii=False, indent=2)
            return True
        except:
            return False
    
    def refresh_recipe_list(self):
        """刷新菜谱列表"""
        # 清空列表
        for item in self.recipe_tree.get_children():
            self.recipe_tree.delete(item)
        
        # 显示所有菜谱
        for recipe in self.recipes:
            # 检查是否收藏
            name = f"⭐ {recipe.name}" if recipe.favorite else recipe.name
            rating_star = '★' * recipe.rating + '☆' * (5 - recipe.rating)
            self.recipe_tree.insert('', tk.END, values=(
                name,
                recipe.category,
                recipe.difficulty,
                f"{recipe.cooking_time}分钟",
                rating_star
            ), tags=(recipe.name,))
    
    def filter_recipes(self):
        """筛选菜谱"""
        search_text = self.search_var.get().strip().lower()
        category = self.category_var.get()
        
        # 清空列表
        for item in self.recipe_tree.get_children():
            self.recipe_tree.delete(item)
        
        # 筛选并显示
        for recipe in self.recipes:
            # 检查搜索条件
            match_search = (not search_text or 
                          search_text in recipe.name.lower() or 
                          search_text in ' '.join(recipe.ingredients).lower())
            
            # 检查分类
            match_category = (category == "全部" or recipe.category == category)
            
            if match_search and match_category:
                name = f"⭐ {recipe.name}" if recipe.favorite else recipe.name
                rating_star = '★' * recipe.rating + '☆' * (5 - recipe.rating)
                self.recipe_tree.insert('', tk.END, values=(
                    name,
                    recipe.category,
                    recipe.difficulty,
                    f"{recipe.cooking_time}分钟",
                    rating_star
                ), tags=(recipe.name,))
    
    def on_recipe_select(self, event):
        """选择菜谱事件"""
        selection = self.recipe_tree.selection()
        if selection:
            item = selection[0]
            values = self.recipe_tree.item(item, 'values')
            if values:
                recipe_name = values[0]
                # 移除星标
                if recipe_name.startswith('⭐ '):
                    recipe_name = recipe_name[2:]
                
                # 查找菜谱
                for recipe in self.recipes:
                    if recipe.name == recipe_name:
                        self.current_recipe = recipe
                        self.show_recipe_detail(recipe)
                        break
    
    def on_recipe_double_click(self, event):
        """双击菜谱编辑"""
        self.edit_recipe()
    
    def show_recipe_detail(self, recipe):
        """显示菜谱详情"""
        self.detail_text.config(state=tk.NORMAL)
        self.detail_text.delete(1.0, tk.END)
        
        # 标题
        header = f"{'⭐ ' if recipe.favorite else ''}{recipe.name}\n"
        header += "=" * 50 + "\n\n"
        
        # 基本信息
        info = f"📂 分类: {recipe.category}\n"
        info += f"⏱️ 烹饪时间: {recipe.cooking_time}分钟\n"
        info += f"📊 难度: {recipe.difficulty}\n"
        info += f"⭐ 评分: {'★' * recipe.rating}{'☆' * (5 - recipe.rating)}\n"
        info += f"📅 创建日期: {recipe.created_date}\n"
        
        if recipe.tags:
            info += f"🏷️ 标签: {' '.join([f'#{tag}' for tag in recipe.tags])}\n"
        
        info += "\n" + "=" * 50 + "\n\n"
        
        # 食材
        info += "🥬 食材清单:\n"
        for ingredient in recipe.ingredients:
            info += f"  • {ingredient}\n"
        
        info += "\n" + "=" * 50 + "\n\n"
        
        # 步骤
        info += "👨‍🍳 烹饪步骤:\n"
        for i, step in enumerate(recipe.steps, 1):
            info += f"  {i}. {step}\n"
        
        self.detail_text.insert(1.0, header + info)
        self.detail_text.config(state=tk.DISABLED)
    
    def add_recipe(self):
        """添加菜谱"""
        AddEditRecipeDialog(self.root, self, None, "添加菜谱")
    
    def edit_recipe(self):
        """编辑菜谱"""
        if not self.current_recipe:
            messagebox.showinfo("提示", "请先选择一道菜谱")
            return
        
        AddEditRecipeDialog(self.root, self, self.current_recipe, "编辑菜谱")
    
    def delete_recipe(self):
        """删除菜谱"""
        if not self.current_recipe:
            messagebox.showinfo("提示", "请先选择一道菜谱")
            return
        
        if messagebox.askyesno("确认删除", f"确定要删除菜谱 '{self.current_recipe.name}' 吗？"):
            self.recipes.remove(self.current_recipe)
            self.save_recipes()
            self.current_recipe = None
            self.detail_text.config(state=tk.NORMAL)
            self.detail_text.delete(1.0, tk.END)
            self.detail_text.config(state=tk.DISABLED)
            self.detail_title.config(text="选择一道菜谱查看详情")
            self.refresh_recipe_list()
            messagebox.showinfo("成功", "菜谱已删除")
    
    def toggle_favorite(self):
        """切换收藏状态"""
        if not self.current_recipe:
            messagebox.showinfo("提示", "请先选择一道菜谱")
            return
        
        self.current_recipe.favorite = not self.current_recipe.favorite
        self.save_recipes()
        self.refresh_recipe_list()
        self.show_recipe_detail(self.current_recipe)
        
        status = "已收藏" if self.current_recipe.favorite else "已取消收藏"
        messagebox.showinfo("成功", f"{status}！")
    
    def random_recipe(self):
        """随机推荐菜谱"""
        if not self.recipes:
            messagebox.showinfo("提示", "还没有菜谱，请先添加")
            return
        
        recipe = random.choice(self.recipes)
        self.current_recipe = recipe
        
        # 在列表中选中
        for item in self.recipe_tree.get_children():
            values = self.recipe_tree.item(item, 'values')
            if values:
                name = values[0]
                if name.startswith('⭐ '):
                    name = name[2:]
                if name == recipe.name:
                    self.recipe_tree.selection_set(item)
                    self.recipe_tree.see(item)
                    break
        
        self.show_recipe_detail(recipe)
        messagebox.showinfo("🎲 随机推荐", f"今天推荐你试试：\n\n{recipe.name}\n\n分类：{recipe.category}\n时间：{recipe.cooking_time}分钟")
    
    def export_data(self):
        """导出数据"""
        if not self.recipes:
            messagebox.showinfo("提示", "没有数据可导出")
            return
        
        filename = filedialog.asksaveasfilename(
            defaultextension=".json",
            filetypes=[("JSON files", "*.json"), ("All files", "*.*")],
            initialfile=f"recipes_backup_{datetime.now().strftime('%Y%m%d')}.json"
        )
        
        if filename:
            try:
                data = [recipe.to_dict() for recipe in self.recipes]
                with open(filename, 'w', encoding='utf-8') as f:
                    json.dump(data, f, ensure_ascii=False, indent=2)
                messagebox.showinfo("成功", f"数据已导出到：{filename}")
            except Exception as e:
                messagebox.showerror("错误", f"导出失败：{e}")
    
    def on_closing(self):
        """关闭窗口"""
        self.save_recipes()
        self.root.destroy()
    
    def run(self):
        """运行应用"""
        self.root.mainloop()


class AddEditRecipeDialog:
    """添加/编辑菜谱对话框"""
    def __init__(self, parent, app, recipe=None, title="添加菜谱"):
        self.parent = parent
        self.app = app
        self.recipe = recipe
        self.result = None
        
        # 创建对话框
        self.dialog = tk.Toplevel(parent.root)
        self.dialog.title(title)
        self.dialog.geometry("700x650")
        self.dialog.transient(parent.root)
        self.dialog.grab_set()
        self.dialog.configure(bg='white')
        
        # 标题
        tk.Label(
            self.dialog,
            text=title,
            font=('Arial', 16, 'bold'),
            bg='white'
        ).pack(pady=10)
        
        # 表单框架
        form_frame = tk.Frame(self.dialog, bg='white')
        form_frame.pack(fill=tk.BOTH, expand=True, padx=20, pady=10)
        
        # 菜谱名称
        tk.Label(form_frame, text="菜谱名称:", font=('Arial', 11), bg='white').grid(row=0, column=0, sticky=tk.W, pady=5)
        self.name_entry = tk.Entry(form_frame, width=40, font=('Arial', 11))
        self.name_entry.grid(row=0, column=1, pady=5)
        
        # 分类
        tk.Label(form_frame, text="分类:", font=('Arial', 11), bg='white').grid(row=1, column=0, sticky=tk.W, pady=5)
        self.category_var = tk.StringVar()
        category_combo = ttk.Combobox(form_frame, textvariable=self.category_var, 
                                     values=["川菜", "粤菜", "鲁菜", "苏菜", "浙菜", 
                                            "闽菜", "湘菜", "徽菜", "家常菜", "西餐", 
                                            "甜点", "饮品", "其他"],
                                     width=37, state='readonly')
        category_combo.grid(row=1, column=1, pady=5)
        
        # 难度
        tk.Label(form_frame, text="难度:", font=('Arial', 11), bg='white').grid(row=2, column=0, sticky=tk.W, pady=5)
        self.difficulty_var = tk.StringVar(value="中等")
        difficulty_combo = ttk.Combobox(form_frame, textvariable=self.difficulty_var,
                                       values=["简单", "中等", "困难"],
                                       width=37, state='readonly')
        difficulty_combo.grid(row=2, column=1, pady=5)
        
        # 烹饪时间
        tk.Label(form_frame, text="烹饪时间(分钟):", font=('Arial', 11), bg='white').grid(row=3, column=0, sticky=tk.W, pady=5)
        self.time_entry = tk.Entry(form_frame, width=40, font=('Arial', 11))
        self.time_entry.grid(row=3, column=1, pady=5)
        
        # 评分
        tk.Label(form_frame, text="评分:", font=('Arial', 11), bg='white').grid(row=4, column=0, sticky=tk.W, pady=5)
        self.rating_var = tk.IntVar(value=3)
        rating_frame = tk.Frame(form_frame, bg='white')
        rating_frame.grid(row=4, column=1, sticky=tk.W, pady=5)
        for i in range(1, 6):
            tk.Radiobutton(rating_frame, text=str(i), variable=self.rating_var, 
                          value=i, bg='white').pack(side=tk.LEFT, padx=5)
        
        # 标签
        tk.Label(form_frame, text="标签 (用逗号分隔):", font=('Arial', 11), bg='white').grid(row=5, column=0, sticky=tk.W, pady=5)
        self.tags_entry = tk.Entry(form_frame, width=40, font=('Arial', 11))
        self.tags_entry.grid(row=5, column=1, pady=5)
        
        # 食材
        tk.Label(form_frame, text="食材清单 (每行一个):", font=('Arial', 11), bg='white').grid(row=6, column=0, sticky=tk.NW, pady=5)
        self.ingredients_text = scrolledtext.ScrolledText(form_frame, width=40, height=6, font=('Arial', 11))
        self.ingredients_text.grid(row=6, column=1, pady=5)
        
        # 步骤
        tk.Label(form_frame, text="烹饪步骤 (每行一步):", font=('Arial', 11), bg='white').grid(row=7, column=0, sticky=tk.NW, pady=5)
        self.steps_text = scrolledtext.ScrolledText(form_frame, width=40, height=6, font=('Arial', 11))
        self.steps_text.grid(row=7, column=1, pady=5)
        
        # 如果编辑，填充数据
        if recipe:
            self.name_entry.insert(0, recipe.name)
            self.category_var.set(recipe.category)
            self.difficulty_var.set(recipe.difficulty)
            self.time_entry.insert(0, str(recipe.cooking_time))
            self.rating_var.set(recipe.rating)
            self.tags_entry.insert(0, ', '.join(recipe.tags))
            self.ingredients_text.insert(1.0, '\n'.join(recipe.ingredients))
            self.steps_text.insert(1.0, '\n'.join(recipe.steps))
        
        # 按钮框架
        button_frame = tk.Frame(self.dialog, bg='white')
        button_frame.pack(fill=tk.X, padx=20, pady=20)
        
        tk.Button(
            button_frame,
            text="💾 保存",
            command=self.save_recipe,
            bg='#27ae60',
            fg='white',
            font=('Arial', 11, 'bold'),
            width=15
        ).pack(side=tk.LEFT, padx=5)
        
        tk.Button(
            button_frame,
            text="❌ 取消",
            command=self.dialog.destroy,
            bg='#e74c3c',
            fg='white',
            font=('Arial', 11, 'bold'),
            width=15
        ).pack(side=tk.LEFT, padx=5)
    
    def save_recipe(self):
        """保存菜谱"""
        # 获取数据
        name = self.name_entry.get().strip()
        if not name:
            messagebox.showerror("错误", "请输入菜谱名称")
            return
        
        category = self.category_var.get()
        if not category:
            messagebox.showerror("错误", "请选择分类")
            return
        
        difficulty = self.difficulty_var.get()
        
        try:
            cooking_time = int(self.time_entry.get().strip())
        except:
            messagebox.showerror("错误", "请输入有效的烹饪时间")
            return
        
        rating = self.rating_var.get()
        
        tags = [tag.strip() for tag in self.tags_entry.get().split(',') if tag.strip()]
        
        ingredients = [line.strip() for line in self.ingredients_text.get(1.0, tk.END).strip().split('\n') if line.strip()]
        if not ingredients:
            messagebox.showerror("错误", "请输入至少一个食材")
            return
        
        steps = [line.strip() for line in self.steps_text.get(1.0, tk.END).strip().split('\n') if line.strip()]
        if not steps:
            messagebox.showerror("错误", "请输入至少一个步骤")
            return
        
        # 保存
        if self.recipe:
            # 编辑现有菜谱
            self.recipe.name = name
            self.recipe.category = category
            self.recipe.ingredients = ingredients
            self.recipe.steps = steps
            self.recipe.tags = tags
            self.recipe.rating = rating
            self.recipe.cooking_time = cooking_time
            self.recipe.difficulty = difficulty
        else:
            # 添加新菜谱
            new_recipe = Recipe(name, category, ingredients, steps, tags, rating, cooking_time, difficulty)
            self.app.recipes.append(new_recipe)
        
        self.app.save_recipes()
        self.app.refresh_recipe_list()
        
        # 显示新菜谱
        if self.recipe:
            self.app.show_recipe_detail(self.recipe)
        
        self.dialog.destroy()
        messagebox.showinfo("成功", f"菜谱 '{name}' 已保存！")


if __name__ == "__main__":
    app = RecipeApp()
    app.run()