#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
AI-КАЛОРИЯ - Telegram бот для отслеживания калорий с использованием OpenAI GPT
"""

import logging
import os
import json
from datetime import datetime
from typing import Optional, Dict, Any, List

# Загрузка переменных окружения из .env файла
from dotenv import load_dotenv
load_dotenv()

import telebot
from telebot import types
from telebot.types import Message, InlineKeyboardMarkup, InlineKeyboardButton

from config import BOT_TOKEN, OPENAI_API_KEY
from database import DatabaseManager
from openai_client import OpenAIClient

# Настройка логирования
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    handlers=[
        logging.FileHandler('ai_calories_bot.log', encoding='utf-8'),
        logging.StreamHandler()
    ]
)
logger = logging.getLogger(__name__)

# Инициализация бота
bot = telebot.TeleBot(BOT_TOKEN)

# Инициализация компонентов
db_manager = DatabaseManager()
openai_client = OpenAIClient(OPENAI_API_KEY)

# Состояния пользователей
user_states = {}

class UserState:
    WAITING_FOR_FOOD_INFO = "waiting_for_food_info"
    PROCESSING = "processing"

@bot.message_handler(commands=['start'])
def send_welcome(message: Message):
    """Обработчик команды /start"""
    user_id = message.from_user.id
    username = message.from_user.username or message.from_user.first_name
    
    # Создаем главное меню с кнопками
    keyboard = InlineKeyboardMarkup()
    keyboard.row(
        InlineKeyboardButton("📊 Статистика", callback_data="menu_stats"),
        InlineKeyboardButton("🍽️ Рацион", callback_data="menu_diet")
    )
    keyboard.row(
        InlineKeyboardButton("🗑️ Очистить историю", callback_data="menu_clear"),
        InlineKeyboardButton("ℹ️ Помощь", callback_data="menu_help")
    )
    
    # Получаем имя пользователя
    user_name = message.from_user.first_name or "Пользователь"
    
    welcome_text = f"""🍎 <b>Добро пожаловать в AI-КАЛОРИЯ, {user_name}!</b>

Я помогу вам отслеживать калории с помощью искусственного интеллекта.

📝 <b>Как пользоваться:</b>
• Отправьте голосовое сообщение с описанием того, что вы съели
• Например: <i>"Съел тарелку гречки 300 грамм"</i>
• Я проанализирую и добавлю в ваш дневник питания

🎯 <b>Выберите действие:</b>"""
    
    bot.reply_to(message, welcome_text, reply_markup=keyboard, parse_mode='HTML')
    logger.info(f"Пользователь {user_id} ({username}) запустил бота")

@bot.message_handler(commands=['help'])
def send_help(message: Message):
    """Обработчик команды /help"""
    help_text = """
🤖 AI-КАЛОРИЯ - Помощь

📱 Как пользоваться:
1. Отправьте голосовое сообщение с описанием еды
2. Укажите что съели и в каком количестве
3. Получите красивый отчет с калориями

💡 Примеры сообщений:
• "Съел тарелку гречки 300 грамм"
• "Выпил стакан молока 250 мл"
• "Съел яблоко среднего размера"
• "Пицца Маргарита 2 куска"

⚠️ Важно:
• Указывайте количество (граммы, миллилитры, штуки)
• Будьте конкретны в описании
• Если информации недостаточно, я попрошу уточнить

📊 Команды:
/stats - Ваша статистика
/history - История записей
/clear - Очистить историю
"""
    
    bot.reply_to(message, help_text)

@bot.message_handler(commands=['stats'])
def send_stats(message: Message):
    """Обработчик команды /stats"""
    user_id = message.from_user.id
    
    try:
        stats = db_manager.get_user_stats(user_id)
        
        if not stats:
            bot.reply_to(message, "📊 У вас пока нет записей о питании.\nОтправьте голосовое сообщение с описанием еды!")
            return
        
        stats_text = f"""
📊 Ваша статистика питания

📅 Записей за все время: {stats['total_records']}
🔥 Общие калории: {stats['total_calories']:.0f} ккал
📈 Среднее за день: {stats['avg_calories_per_day']:.0f} ккал
📆 Последняя запись: {stats['last_record_date']}

🏆 Топ продуктов:
{format_top_foods(stats['top_foods'])}
"""
        
        bot.reply_to(message, stats_text)
        
    except Exception as e:
        logger.error(f"Ошибка при получении статистики для пользователя {user_id}: {e}")
        bot.reply_to(message, "❌ Ошибка при получении статистики. Попробуйте позже.")

@bot.message_handler(commands=['history'])
def send_history(message: Message):
    """Обработчик команды /history"""
    user_id = message.from_user.id
    
    try:
        history = db_manager.get_user_history(user_id, limit=10)
        
        if not history:
            bot.reply_to(message, "📝 У вас пока нет записей о питании.\nОтправьте голосовое сообщение с описанием еды!")
            return
        
        history_text = "📝 Последние записи:\n\n"
        
        for record in history:
            date_str = record['created_at'].strftime('%d.%m.%Y %H:%M')
            history_text += f"🕐 {date_str}\n"
            history_text += f"🍽️ {record['food_name']}\n"
            history_text += f"⚖️ {record['amount']} {record['unit']}\n"
            history_text += f"🔥 {record['calories']:.0f} ккал\n\n"
        
        if len(history_text) > 4000:
            history_text = history_text[:4000] + "\n... (показаны последние записи)"
        
        bot.reply_to(message, history_text)
        
    except Exception as e:
        logger.error(f"Ошибка при получении истории для пользователя {user_id}: {e}")
        bot.reply_to(message, "❌ Ошибка при получении истории. Попробуйте позже.")

@bot.message_handler(commands=['clear'])
def clear_history(message: Message):
    """Обработчик команды /clear"""
    user_id = message.from_user.id
    
    # Создаем клавиатуру подтверждения
    keyboard = types.InlineKeyboardMarkup()
    yes_button = types.InlineKeyboardButton("✅ Да", callback_data=f"clear_yes_{user_id}")
    no_button = types.InlineKeyboardButton("❌ Нет", callback_data=f"clear_no_{user_id}")
    keyboard.add(yes_button, no_button)
    
    bot.reply_to(message, 
                "⚠️ Вы уверены, что хотите удалить всю историю записей?\nЭто действие нельзя отменить!",
                reply_markup=keyboard)

@bot.callback_query_handler(func=lambda call: call.data.startswith('clear_'))
def handle_clear_callback(call):
    """Обработчик callback для подтверждения очистки"""
    user_id = call.from_user.id
    action = call.data.split('_')[1]
    
    if action == 'yes':
        try:
            db_manager.clear_user_history(user_id)
            bot.answer_callback_query(call.id, "✅ История очищена!")
            bot.edit_message_text("✅ История записей успешно очищена!", 
                                call.message.chat.id, call.message.message_id)
        except Exception as e:
            logger.error(f"Ошибка при очистке истории для пользователя {user_id}: {e}")
            bot.answer_callback_query(call.id, "❌ Ошибка при очистке истории")
    else:
        bot.answer_callback_query(call.id, "❌ Отменено")

@bot.message_handler(commands=['diet'])
def show_diet_menu(message: Message):
    """Показать меню рациона"""
    user_id = message.from_user.id
    
    keyboard = InlineKeyboardMarkup()
    keyboard.row(
        InlineKeyboardButton("📅 Сегодня", callback_data="diet_today"),
        InlineKeyboardButton("📅 Вчера", callback_data="diet_yesterday")
    )
    keyboard.row(
        InlineKeyboardButton("📅 Выбрать дату", callback_data="diet_select_date"),
        InlineKeyboardButton("📊 За неделю", callback_data="diet_week")
    )
    keyboard.row(
        InlineKeyboardButton("📋 Все записи", callback_data="diet_all_records"),
        InlineKeyboardButton("🗑️ Удалить запись", callback_data="diet_delete")
    )
    
    bot.reply_to(message, "🍽️ Выберите период для просмотра рациона:", reply_markup=keyboard)

@bot.message_handler(commands=['records'])
def show_all_records(message: Message):
    """Показать все записи с пагинацией"""
    user_id = message.from_user.id
    
    try:
        # Получаем первую страницу записей
        data = db_manager.get_user_records_paginated(user_id, page=1, per_page=10)
        
        if not data['records']:
            bot.reply_to(message, "📝 У вас пока нет записей о еде.")
            return
        
        # Формируем сообщение
        text = f"📋 **Все записи** (страница {data['pagination']['current_page']}/{data['pagination']['total_pages']})\n\n"
        
        for i, record in enumerate(data['records'], 1):
            time_str = record['created_at'].strftime('%H:%M')
            text += f"{i}. **{record['food_name']}** - {record['amount']} {record['unit']} ({record['calories']} ккал) 🕐 {time_str}\n"
        
        # Создаем клавиатуру
        keyboard = InlineKeyboardMarkup()
        
        # Кнопки навигации
        nav_buttons = []
        if data['pagination']['has_prev']:
            nav_buttons.append(InlineKeyboardButton("⬅️ Назад", callback_data=f"records_page:{data['pagination']['current_page']-1}"))
        if data['pagination']['has_next']:
            nav_buttons.append(InlineKeyboardButton("Вперед ➡️", callback_data=f"records_page:{data['pagination']['current_page']+1}"))
        
        if nav_buttons:
            keyboard.row(*nav_buttons)
        
        # Кнопка главного меню
        keyboard.row(InlineKeyboardButton("🏠 Главное меню", callback_data="menu_back"))
        
        bot.reply_to(message, text, reply_markup=keyboard, parse_mode='Markdown')
        
    except Exception as e:
        logger.error(f"Ошибка при получении всех записей: {e}")
        bot.reply_to(message, "❌ Ошибка при получении записей. Попробуйте позже.")

@bot.message_handler(content_types=['voice'])
def handle_voice_message(message: Message):
    """Обработчик голосовых сообщений"""
    user_id = message.from_user.id
    username = message.from_user.username or message.from_user.first_name
    
    logger.info(f"Получено голосовое сообщение от пользователя {user_id} ({username})")
    
    try:
        # Устанавливаем состояние обработки
        user_states[user_id] = UserState.PROCESSING
        
        # Отправляем сообщение о начале обработки
        processing_msg = bot.reply_to(message, "🎤 Обрабатываю ваше голосовое сообщение...")
        
        # Получаем файл голосового сообщения
        file_info = bot.get_file(message.voice.file_id)
        voice_file = bot.download_file(file_info.file_path)
        
        # Конвертируем голос в текст
        text = openai_client.speech_to_text(voice_file)
        
        if not text:
            bot.edit_message_text("❌ Не удалось распознать речь. Попробуйте записать сообщение еще раз.", 
                                message.chat.id, processing_msg.message_id)
            return
        
        logger.info(f"Распознанный текст: {text}")
        
        # Обрабатываем текст с помощью GPT
        food_info = openai_client.analyze_food_intake(text)
        
        logger.info(f"Результат анализа еды: {food_info}")
        
        if not food_info or not food_info.get('success'):
            error_msg = food_info.get('message', 'Не удалось проанализировать информацию о еде.')
            logger.warning(f"Ошибка анализа еды: {error_msg}")
            
            # Проверяем, есть ли популярные варианты для этого продукта
            variants_keyboard = create_food_variants_keyboard(text)
            if variants_keyboard:
                bot.edit_message_text(
                    f"🤔 Уточните, какой именно {text.lower()} вы имели в виду:",
                    message.chat.id, 
                    processing_msg.message_id,
                    reply_markup=variants_keyboard
                )
            else:
                bot.edit_message_text(f"❌ {error_msg}\n\nПопробуйте быть более конкретным, например:\n• 'Съел тарелку гречки 300 грамм'\n• 'Выпил стакан молока 250 мл'", 
                                    message.chat.id, processing_msg.message_id)
            return
        
        # Проверяем, нужно ли показать варианты уточнения даже для успешного запроса
        # Используем GPT для определения, нужны ли варианты уточнения
        should_show_variants = should_ask_for_clarification(text, food_info)
        if should_show_variants:
            variants_keyboard = create_food_variants_keyboard(text)
            if variants_keyboard:
                # Показываем варианты уточнения
                bot.edit_message_text(
                    f"🤔 Уточните, какой именно {text.lower()} вы имели в виду:",
                    message.chat.id, 
                    processing_msg.message_id,
                    reply_markup=variants_keyboard
                )
                return
        
        # Сохраняем в базу данных
        record_id = db_manager.add_food_record(
            user_id=user_id,
            username=username,
            food_name=food_info['food_name'],
            amount=food_info['amount'],
            unit=food_info['unit'],
            calories=food_info['calories']
        )
        
        # Формируем красивое сообщение
        response_text = format_food_record(food_info, record_id, user_id)
        
        # Создаем клавиатуру с кнопками для управления записью
        keyboard = InlineKeyboardMarkup()
        keyboard.row(
            InlineKeyboardButton("✏️ Изменить", callback_data=f"edit_record:{record_id}"),
            InlineKeyboardButton("🗑️ Удалить", callback_data=f"delete_record:{record_id}")
        )
        
        # Отправляем изображение еды из базы
        try:
            image_path = get_food_image(food_info['food_name'])
            if image_path and os.path.exists(image_path):
                # Отправляем изображение с подписью
                with open(image_path, 'rb') as photo:
                    bot.send_photo(
                        chat_id=message.chat.id,
                        photo=photo,
                        caption=response_text,
                        reply_markup=keyboard,
                        parse_mode='HTML'
                    )
                # Удаляем сообщение о обработке
                bot.delete_message(message.chat.id, processing_msg.message_id)
            else:
                # Если изображение не найдено, отправляем только текст
                bot.edit_message_text(response_text, message.chat.id, processing_msg.message_id, 
                                   reply_markup=keyboard, parse_mode='HTML')
        except Exception as e:
            logger.error(f"Ошибка при отправке изображения: {e}")
            # Отправляем только текст если изображение не удалось
            bot.edit_message_text(response_text, message.chat.id, processing_msg.message_id, parse_mode='HTML')
        
        logger.info(f"Успешно добавлена запись {record_id} для пользователя {user_id}")
        
    except Exception as e:
        logger.error(f"Ошибка при обработке голосового сообщения от пользователя {user_id}: {e}")
        bot.reply_to(message, "❌ Произошла ошибка при обработке сообщения. Попробуйте позже.")
    
    finally:
        # Сбрасываем состояние
        user_states.pop(user_id, None)

@bot.message_handler(content_types=['text'])
def handle_text_message(message: Message):
    """Обработчик текстовых сообщений"""
    user_id = message.from_user.id
    text = message.text.strip()
    
    # Игнорируем команды
    if text.startswith('/'):
        return
    
    logger.info(f"Получено текстовое сообщение от пользователя {user_id}: {text}")
    
    # Проверяем, есть ли состояние ожидания изменения калорий
    if user_id in user_states:
        state_info = user_states[user_id]
        # Проверяем, что state_info является словарем
        if isinstance(state_info, dict) and state_info.get('action') == 'edit_calories':
            # Обрабатываем изменение калорий
            record_id = state_info.get('record_id')
            if record_id:
                result = handle_calories_edit(user_id, text, record_id)
                
                if isinstance(result, dict) and result.get('success'):
                    # Отправляем новое сообщение с обновленной информацией
                    bot.send_message(
                        message.chat.id,
                        result['text'],
                        reply_markup=result['keyboard'],
                        parse_mode='HTML'
                    )
                    # Сбрасываем состояние
                    user_states.pop(user_id, None)
                else:
                    # Показываем ошибку
                    bot.reply_to(message, result)
            return
        
        # Проверяем, есть ли состояние ожидания указания количества для выбранного продукта
        if isinstance(state_info, dict) and state_info.get('action') == 'waiting_for_quantity':
            selected_food = state_info.get('selected_food')
            if selected_food:
                # Пользователь указал количество для выбранного продукта
                full_description = f"{selected_food} {text}"
                logger.info(f"Пользователь указал количество для {selected_food}: {full_description}")
                
                # Сбрасываем состояние
                user_states.pop(user_id, None)
                
                # Обрабатываем полное описание
                try:
                    # Устанавливаем состояние обработки
                    user_states[user_id] = UserState.PROCESSING
                    
                    # Отправляем сообщение о начале обработки
                    processing_msg = bot.reply_to(message, "📝 Анализирую информацию о еде...")
                    
                    # Обрабатываем текст с помощью GPT
                    food_info = openai_client.analyze_food_intake(full_description)
                    
                    logger.info(f"Результат анализа еды: {food_info}")
                    
                    if not food_info or not food_info.get('success'):
                        error_msg = food_info.get('message', 'Не удалось проанализировать информацию о еде.')
                        logger.warning(f"Ошибка анализа еды: {error_msg}")
                        
                        # Просим уточнить
                        bot.edit_message_text(
                            f"❌ {error_msg}\n\nПопробуйте быть более конкретным, например:\n• '200 грамм', '1 порция', '2 штуки'",
                            message.chat.id, 
                            processing_msg.message_id
                        )
                        return
                    
                    # Сохраняем в базу данных
                    username = message.from_user.username or message.from_user.first_name
                    record_id = db_manager.add_food_record(
                        user_id=user_id,
                        username=username,
                        food_name=food_info['food_name'],
                        amount=food_info['amount'],
                        unit=food_info['unit'],
                        calories=food_info['calories']
                    )
                    
                    # Проверяем, нужно ли предложить гарниры
                    side_dishes_keyboard = create_side_dishes_keyboard(food_info['food_name'])
                    if side_dishes_keyboard:
                        # Показываем гарниры
                        bot.edit_message_text(
                            f"🍽️ Добавлено: {food_info['food_name']}\n\n🤔 Хотите добавить гарнир или дополнение?",
                            message.chat.id, 
                            processing_msg.message_id,
                            reply_markup=side_dishes_keyboard
                        )
                        return
                    
                    # Формируем красивое сообщение
                    response_text = format_food_record(food_info, record_id, user_id)
                    
                    # Создаем клавиатуру с кнопками для управления записью
                    keyboard = InlineKeyboardMarkup()
                    keyboard.row(
                        InlineKeyboardButton("✏️ Изменить", callback_data=f"edit_record:{record_id}"),
                        InlineKeyboardButton("🗑️ Удалить", callback_data=f"delete_record:{record_id}")
                    )
                    
                    # Отправляем изображение еды из базы
                    try:
                        image_path = get_food_image(food_info['food_name'])
                        if image_path and os.path.exists(image_path):
                            # Отправляем изображение с подписью
                            with open(image_path, 'rb') as photo:
                                bot.send_photo(
                                    chat_id=message.chat.id,
                                    photo=photo,
                                    caption=response_text,
                                    reply_markup=keyboard,
                                    parse_mode='HTML'
                                )
                            # Удаляем сообщение о обработке
                            bot.delete_message(message.chat.id, processing_msg.message_id)
                        else:
                            # Если изображение не найдено, отправляем только текст
                            bot.edit_message_text(response_text, message.chat.id, processing_msg.message_id, 
                                               reply_markup=keyboard, parse_mode='HTML')
                    except Exception as e:
                        logger.error(f"Ошибка при отправке изображения: {e}")
                        # Отправляем только текст если изображение не удалось
                        bot.edit_message_text(response_text, message.chat.id, processing_msg.message_id, parse_mode='HTML')
                    
                    logger.info(f"Успешно добавлена запись {record_id} для пользователя {user_id}")
                    
                except Exception as e:
                    logger.error(f"Ошибка при обработке текстового сообщения от пользователя {user_id}: {e}")
                    bot.reply_to(message, "❌ Произошла ошибка при обработке сообщения. Попробуйте позже.")
                
                finally:
                    # Сбрасываем состояние
                    user_states.pop(user_id, None)
                return
        
        # Проверяем, есть ли состояние ожидания указания количества для гарнира
        if isinstance(state_info, dict) and state_info.get('action') == 'waiting_for_side_dish_quantity':
            selected_side_dish = state_info.get('selected_side_dish')
            if selected_side_dish:
                # Пользователь указал количество для выбранного гарнира
                full_description = f"{selected_side_dish} {text}"
                logger.info(f"Пользователь указал количество для гарнира {selected_side_dish}: {full_description}")
                
                # Сбрасываем состояние
                user_states.pop(user_id, None)
                
                # Обрабатываем полное описание
                try:
                    # Устанавливаем состояние обработки
                    user_states[user_id] = UserState.PROCESSING
                    
                    # Отправляем сообщение о начале обработки
                    processing_msg = bot.reply_to(message, "📝 Анализирую информацию о еде...")
                    
                    # Обрабатываем текст с помощью GPT
                    food_info = openai_client.analyze_food_intake(full_description)
                    
                    logger.info(f"Результат анализа еды: {food_info}")
                    
                    if not food_info or not food_info.get('success'):
                        error_msg = food_info.get('message', 'Не удалось проанализировать информацию о еде.')
                        logger.warning(f"Ошибка анализа еды: {error_msg}")
                        
                        # Просим уточнить
                        bot.edit_message_text(
                            f"❌ {error_msg}\n\nПопробуйте быть более конкретным, например:\n• '200 грамм', '1 порция', '2 штуки'",
                            message.chat.id, 
                            processing_msg.message_id
                        )
                        return
                    
                    # Сохраняем в базу данных
                    username = message.from_user.username or message.from_user.first_name
                    record_id = db_manager.add_food_record(
                        user_id=user_id,
                        username=username,
                        food_name=food_info['food_name'],
                        amount=food_info['amount'],
                        unit=food_info['unit'],
                        calories=food_info['calories']
                    )
                    
                    # Формируем красивое сообщение
                    response_text = format_food_record(food_info, record_id, user_id)
                    
                    # Создаем клавиатуру с кнопками для управления записью
                    keyboard = InlineKeyboardMarkup()
                    keyboard.row(
                        InlineKeyboardButton("✏️ Изменить", callback_data=f"edit_record:{record_id}"),
                        InlineKeyboardButton("🗑️ Удалить", callback_data=f"delete_record:{record_id}")
                    )
                    
                    # Отправляем изображение еды из базы
                    try:
                        image_path = get_food_image(food_info['food_name'])
                        if image_path and os.path.exists(image_path):
                            # Отправляем изображение с подписью
                            with open(image_path, 'rb') as photo:
                                bot.send_photo(
                                    chat_id=message.chat.id,
                                    photo=photo,
                                    caption=response_text,
                                    reply_markup=keyboard,
                                    parse_mode='HTML'
                                )
                            # Удаляем сообщение о обработке
                            bot.delete_message(message.chat.id, processing_msg.message_id)
                        else:
                            # Если изображение не найдено, отправляем только текст
                            bot.edit_message_text(response_text, message.chat.id, processing_msg.message_id, 
                                               reply_markup=keyboard, parse_mode='HTML')
                    except Exception as e:
                        logger.error(f"Ошибка при отправке изображения: {e}")
                        # Отправляем только текст если изображение не удалось
                        bot.edit_message_text(response_text, message.chat.id, processing_msg.message_id, parse_mode='HTML')
                    
                    logger.info(f"Успешно добавлена запись {record_id} для пользователя {user_id}")
                    
                except Exception as e:
                    logger.error(f"Ошибка при обработке текстового сообщения от пользователя {user_id}: {e}")
                    bot.reply_to(message, "❌ Произошла ошибка при обработке сообщения. Попробуйте позже.")
                
                finally:
                    # Сбрасываем состояние
                    user_states.pop(user_id, None)
                return
    
    try:
        # Устанавливаем состояние обработки
        user_states[user_id] = UserState.PROCESSING
        
        # Отправляем сообщение о начале обработки
        processing_msg = bot.reply_to(message, "📝 Анализирую информацию о еде...")
        
        # Обрабатываем текст с помощью GPT
        food_info = openai_client.analyze_food_intake(text)
        
        logger.info(f"Результат анализа еды: {food_info}")
        
        if not food_info or not food_info.get('success'):
            error_msg = food_info.get('message', 'Не удалось проанализировать информацию о еде.')
            logger.warning(f"Ошибка анализа еды: {error_msg}")
            
            # Проверяем, есть ли популярные варианты для этого продукта
            variants_keyboard = create_food_variants_keyboard(text)
            if variants_keyboard:
                bot.edit_message_text(
                    f"🤔 Уточните, какой именно {text.lower()} вы имели в виду:",
                    message.chat.id, 
                    processing_msg.message_id,
                    reply_markup=variants_keyboard
                )
            else:
                bot.edit_message_text(f"❌ {error_msg}\n\nПопробуйте быть более конкретным, например:\n• 'Съел тарелку гречки 300 грамм'\n• 'Выпил стакан молока 250 мл'", 
                                    message.chat.id, processing_msg.message_id)
            return
        
        # Проверяем, нужно ли показать варианты уточнения даже для успешного запроса
        # Используем GPT для определения, нужны ли варианты уточнения
        should_show_variants = should_ask_for_clarification(text, food_info)
        if should_show_variants:
            variants_keyboard = create_food_variants_keyboard(text)
            if variants_keyboard:
                # Показываем варианты уточнения
                bot.edit_message_text(
                    f"🤔 Уточните, какой именно {text.lower()} вы имели в виду:",
                    message.chat.id, 
                    processing_msg.message_id,
                    reply_markup=variants_keyboard
                )
                return
        
        # Сохраняем в базу данных
        username = message.from_user.username or message.from_user.first_name
        record_id = db_manager.add_food_record(
            user_id=user_id,
            username=username,
            food_name=food_info['food_name'],
            amount=food_info['amount'],
            unit=food_info['unit'],
            calories=food_info['calories']
        )
        
        # Проверяем, нужно ли предложить гарниры
        side_dishes_keyboard = create_side_dishes_keyboard(food_info['food_name'])
        if side_dishes_keyboard:
            # Показываем гарниры
            bot.edit_message_text(
                f"🍽️ Добавлено: {food_info['food_name']}\n\n🤔 Хотите добавить гарнир или дополнение?",
                message.chat.id, 
                processing_msg.message_id,
                reply_markup=side_dishes_keyboard
            )
            return
        
        # Формируем красивое сообщение
        response_text = format_food_record(food_info, record_id, user_id)
        
        # Создаем клавиатуру с кнопками для управления записью
        keyboard = InlineKeyboardMarkup()
        keyboard.row(
            InlineKeyboardButton("✏️ Изменить", callback_data=f"edit_record:{record_id}"),
            InlineKeyboardButton("🗑️ Удалить", callback_data=f"delete_record:{record_id}")
        )
        
        # Отправляем изображение еды из базы
        try:
            image_path = get_food_image(food_info['food_name'])
            if image_path and os.path.exists(image_path):
                # Отправляем изображение с подписью
                with open(image_path, 'rb') as photo:
                    bot.send_photo(
                        chat_id=message.chat.id,
                        photo=photo,
                        caption=response_text,
                        reply_markup=keyboard,
                        parse_mode='HTML'
                    )
                # Удаляем сообщение о обработке
                bot.delete_message(message.chat.id, processing_msg.message_id)
            else:
                # Если изображение не найдено, отправляем только текст
                bot.edit_message_text(response_text, message.chat.id, processing_msg.message_id, 
                                   reply_markup=keyboard, parse_mode='HTML')
        except Exception as e:
            logger.error(f"Ошибка при отправке изображения: {e}")
            # Отправляем только текст если изображение не удалось
            bot.edit_message_text(response_text, message.chat.id, processing_msg.message_id, parse_mode='HTML')
        
        logger.info(f"Успешно добавлена запись {record_id} для пользователя {user_id}")
        
    except Exception as e:
        logger.error(f"Ошибка при обработке текстового сообщения от пользователя {user_id}: {e}")
        bot.reply_to(message, "❌ Произошла ошибка при обработке сообщения. Попробуйте позже.")
    
    finally:
        # Сбрасываем состояние
        user_states.pop(user_id, None)

def should_ask_for_clarification(text: str, food_info: Dict[str, Any]) -> bool:
    """Определяет, нужно ли спрашивать уточнения у пользователя"""
    try:
        # Используем GPT для определения, нужны ли варианты уточнения
        system_prompt = """
Ты - помощник по анализу запросов о еде. Твоя задача - определить, нужно ли уточнение у пользователя.

ПРАВИЛА:
1. Если продукт слишком общий и имеет много вариантов - нужны варианты уточнения
2. Если продукт конкретный и понятный - варианты не нужны
3. Если калории 0 и продукт может иметь варианты - нужны варианты уточнения

ПРИМЕРЫ НУЖНЫХ УТОЧНЕНИЙ:
- "кофе" (может быть американо, капучино, латте и т.д.)
- "печенье" (может быть овсяное, шоколадное и т.д.)
- "каша" (может быть овсяная, манная, пшенная и т.д.)
- "суп" (может быть куриный, овощной и т.д.)
- "салат" (может быть цезарь, греческий и т.д.)
- "мясо" (может быть говядина, свинина, курица и т.д.)

ПРИМЕРЫ НЕ НУЖНЫХ УТОЧНЕНИЙ:
- "овсянка" (конкретный продукт)
- "вода" (конкретный продукт)
- "яблоко" (конкретный продукт)
- "банан" (конкретный продукт)
- "гречка с молоком" (конкретное блюдо)

Отвечай ТОЛЬКО "да" или "нет".
"""
        
        user_prompt = f"Нужно ли уточнение для '{text}' с калориями {food_info.get('calories', 0)}?"
        
        response = openai_client.client.chat.completions.create(
            model=openai_client.config['model'],
            messages=[
                {"role": "system", "content": system_prompt},
                {"role": "user", "content": user_prompt}
            ],
            max_tokens=10,
            temperature=0.1
        )
        
        answer = response.choices[0].message.content.strip().lower()
        return answer == "да"
        
    except Exception as e:
        logger.error(f"Ошибка при определении необходимости уточнения: {e}")
        # Fallback - используем старую логику
        return create_food_variants_keyboard(text) is not None

def get_side_dishes_and_additions(food_name: str) -> List[str]:
    """Получает популярные гарниры и дополнения для блюда"""
    side_dishes = {
        'мясо': [
            'с картофелем',
            'с рисом',
            'с гречкой',
            'с макаронами',
            'с овощами',
            'с салатом'
        ],
        'рыба': [
            'с картофелем',
            'с рисом',
            'с овощами',
            'с салатом',
            'с лимоном',
            'с зеленью'
        ],
        'курица': [
            'с картофелем',
            'с рисом',
            'с гречкой',
            'с овощами',
            'с салатом',
            'с соусом'
        ],
        'котлета': [
            'с картофелем',
            'с рисом',
            'с гречкой',
            'с макаронами',
            'с овощами',
            'с хлебом'
        ],
        'суп': [
            'с хлебом',
            'с сухариками',
            'с зеленью',
            'со сметаной',
            'с лимоном',
            'с чесноком'
        ],
        'каша': [
            'с молоком',
            'с маслом',
            'с сахаром',
            'с фруктами',
            'с ягодами',
            'с орехами'
        ],
        'макароны': [
            'с сыром',
            'с мясом',
            'с овощами',
            'с соусом',
            'с зеленью',
            'с грибами'
        ],
        'рис': [
            'с мясом',
            'с овощами',
            'с соусом',
            'с зеленью',
            'с грибами',
            'с морепродуктами'
        ],
        'картофель': [
            'с мясом',
            'с рыбой',
            'с овощами',
            'с соусом',
            'с зеленью',
            'с грибами'
        ],
        'салат': [
            'с хлебом',
            'с мясом',
            'с сыром',
            'с орехами',
            'с сухариками',
            'с соусом'
        ],
        'яйца': [
            'с хлебом',
            'с беконом',
            'с сыром',
            'с овощами',
            'с зеленью',
            'с соусом'
        ],
        'блины': [
            'с маслом',
            'с вареньем',
            'с медом',
            'с сыром',
            'с мясом',
            'с творогом'
        ],
        'пицца': [
            'с салатом',
            'с соусом',
            'с зеленью',
            'с оливками',
            'с перцем',
            'с грибами'
        ],
        'роллы': [
            'с соевым соусом',
            'с васаби',
            'с имбирем',
            'с салатом',
            'с супом',
            'с чаем'
        ]
    }
    
    # Ищем подходящие гарниры
    food_lower = food_name.lower()
    for key, sides in side_dishes.items():
        if key in food_lower:
            return sides
    
    # Дополнительные проверки для конкретных продуктов
    if any(word in food_lower for word in ['говядина', 'свинина', 'баранина', 'телятина']):
        return side_dishes['мясо']
    elif any(word in food_lower for word in ['лосось', 'треска', 'окунь', 'карп', 'щука']):
        return side_dishes['рыба']
    elif any(word in food_lower for word in ['куриная', 'индейка', 'утка', 'гусь']):
        return side_dishes['курица']
    elif any(word in food_lower for word in ['борщ', 'щи', 'солянка', 'харчо']):
        return side_dishes['суп']
    elif any(word in food_lower for word in ['овсяная', 'манная', 'пшенная', 'перловая', 'ячневая', 'кукурузная']):
        return side_dishes['каша']
    elif any(word in food_lower for word in ['спагетти', 'паста', 'лапша', 'вермишель']):
        return side_dishes['макароны']
    elif any(word in food_lower for word in ['жареный', 'вареный', 'печеный', 'пюре']):
        return side_dishes['картофель']
    elif any(word in food_lower for word in ['цезарь', 'греческий', 'оливье', 'винегрет']):
        return side_dishes['салат']
    elif any(word in food_lower for word in ['жареные', 'вареные', 'омлет', 'глазунья']):
        return side_dishes['яйца']
    elif any(word in food_lower for word in ['сладкие', 'соленые', 'с начинкой']):
        return side_dishes['блины']
    elif any(word in food_lower for word in ['маргарита', 'пепперони', 'четыре сыра', 'гавайская']):
        return side_dishes['пицца']
    elif any(word in food_lower for word in ['филадельфия', 'калифорния', 'дракон', 'аляска']):
        return side_dishes['роллы']
    
    return []

def get_popular_food_variants(food_name: str) -> List[str]:
    """Получает популярные варианты продукта"""
    variants = {
        'печенье': [
            'печенье овсяное',
            'печенье шоколадное',
            'печенье сахарное',
            'печенье песочное',
            'печенье имбирное',
            'печенье с изюмом'
        ],
        'кофе': [
            'кофе американо',
            'кофе капучино',
            'кофе латте',
            'кофе эспрессо',
            'кофе мокко',
            'кофе флэт вайт'
        ],
        'чай': [
            'чай черный',
            'чай зеленый',
            'чай травяной',
            'чай с лимоном',
            'чай с молоком',
            'чай с сахаром'
        ],
        'сок': [
            'сок апельсиновый',
            'сок яблочный',
            'сок виноградный',
            'сок томатный',
            'сок гранатовый',
            'сок мультифрукт'
        ],
        'йогурт': [
            'йогурт натуральный',
            'йогурт с фруктами',
            'йогурт греческий',
            'йогурт питьевой',
            'йогурт с ягодами',
            'йогурт обезжиренный'
        ],
        'сыр': [
            'сыр российский',
            'сыр чеддер',
            'сыр моцарелла',
            'сыр пармезан',
            'сыр фета',
            'сыр творожный'
        ],
        'хлеб': [
            'хлеб белый',
            'хлеб черный',
            'хлеб ржаной',
            'хлеб цельнозерновой',
            'хлеб с отрубями',
            'хлеб бородинский'
        ],
        'мясо': [
            'мясо говядина',
            'мясо свинина',
            'мясо курица',
            'мясо индейка',
            'мясо баранина',
            'мясо телятина'
        ],
        'каша': [
            'каша овсяная',
            'каша манная',
            'каша пшенная',
            'каша перловая',
            'каша ячневая',
            'каша кукурузная'
        ],
        'салат': [
            'салат овощной',
            'салат цезарь',
            'салат греческий',
            'салат оливье',
            'салат винегрет',
            'салат капустный'
        ],
        'сметана': [
            'сметана 15% 1 ст.ложка', 'сметана 20% 2 ст.ложки', 'сметана 25% 1 ст.ложка',
            'сметана 15% 100г', 'сметана 20% 150г', 'сметана домашняя 1 ст.ложка'
        ],
        'масло': [
            'масло сливочное 1 ч.ложка', 'масло сливочное 1 ст.ложка', 'масло сливочное 10г',
            'масло растительное 1 ч.ложка', 'масло оливковое 1 ст.ложка', 'масло подсолнечное 1 ч.ложка'
        ],
        'творог': [
            'творог 5% 100г', 'творог 9% 150г', 'творог обезжиренный 200г',
            'творог домашний 100г', 'творог с изюмом 150г', 'творог с фруктами 200г'
        ],
        'молоко': [
            'молоко 1% 1 стакан', 'молоко 2.5% 250мл', 'молоко 3.2% 1 стакан',
            'молоко обезжиренное 200мл', 'молоко козье 250мл', 'молоко соевое 1 стакан'
        ],
        'кефир': [
            'кефир 1% 1 стакан', 'кефир 2.5% 250мл', 'кефир 3.2% 1 стакан',
            'кефир обезжиренный 200мл', 'кефир бифидок 250мл', 'кефир с фруктами 1 стакан'
        ],
        'ряженка': [
            'ряженка 2.5% 1 стакан', 'ряженка 4% 250мл', 'ряженка 6% 1 стакан',
            'ряженка обезжиренная 200мл', 'ряженка с фруктами 250мл', 'ряженка домашняя 1 стакан'
        ],
        'майонез': [
            'майонез 1 ч.ложка', 'майонез 1 ст.ложка', 'майонез 15г',
            'майонез легкий 1 ст.ложка', 'майонез домашний 1 ч.ложка', 'майонез оливковый 1 ст.ложка'
        ],
        'сосиски': [
            'сосиски молочные 1 шт', 'сосиски куриные 2 шт', 'сосиски говяжьи 1 шт',
            'сосиски детские 2 шт', 'сосиски диетические 1 шт', 'сосиски копченые 1 шт'
        ],
        'колбаса': [
            'колбаса докторская 2 ломтика', 'колбаса сервелат 1 ломтик', 'колбаса салями 2 ломтика',
            'колбаса вареная 3 ломтика', 'колбаса копченая 1 ломтик', 'колбаса диетическая 2 ломтика'
        ],
        'макароны': [
            'макароны отварные 100г', 'макароны с сыром 150г', 'макароны с мясом 200г',
            'макароны с овощами 150г', 'макароны цельнозерновые 100г', 'макароны с соусом 180г'
        ],
        'картофель': [
            'картофель отварной 1 шт', 'картофель жареный 2 шт', 'картофель пюре 150г',
            'картофель запеченный 1 шт', 'картофель фри 100г', 'картофель тушеный 200г'
        ],
        'яйца': [
            'яйцо куриное 1 шт', 'яйца 2 шт', 'яйца 3 шт',
            'яйцо перепелиное 5 шт', 'яйца всмятку 2 шт', 'яйца вкрутую 1 шт'
        ],
        'курица': [
            'курица запеченная 150г', 'курица жареная 200г', 'курица отварная 180г',
            'курица гриль 170г', 'курица тушеная 160г', 'курица копченая 100г'
        ],
        'сладости': [
            'шоколад молочный 1 долька', 'шоколад темный 2 дольки', 'конфеты 3 шт',
            'печенье 2 шт', 'торт 1 кусок', 'пирожное 1 шт'
        ],
        'фрукты': [
            'яблоко 1 шт', 'банан 1 шт', 'апельсин 1 шт',
            'груша 1 шт', 'персик 1 шт', 'виноград 100г'
        ],
        'овощи': [
            'помидоры 2 шт', 'огурцы 1 шт', 'морковь 1 шт',
            'капуста 100г', 'лук 1 шт', 'перец 1 шт'
        ]
    }
    
    # Ищем варианты по ключевым словам
    food_lower = food_name.lower()
    for key, variants_list in variants.items():
        if key in food_lower:
            return variants_list[:6]  # Максимум 6 вариантов
    
    return []

def create_side_dishes_keyboard(food_name: str) -> Optional[InlineKeyboardMarkup]:
    """Создает клавиатуру с гарнирами и дополнениями"""
    side_dishes = get_side_dishes_and_additions(food_name)
    
    if not side_dishes:
        return None
    
    keyboard = InlineKeyboardMarkup()
    
    # Добавляем кнопки с гарнирами (по 2 в ряд)
    for i in range(0, len(side_dishes), 2):
        row = []
        for j in range(2):
            if i + j < len(side_dishes):
                side_dish = side_dishes[i + j]
                row.append(InlineKeyboardButton(
                    text=side_dish,
                    callback_data=f"side_dish:{side_dish}"
                ))
        keyboard.row(*row)
    
    # Добавляем кнопку "Оставить как есть"
    keyboard.row(InlineKeyboardButton(
        text="✅ Оставить как есть",
        callback_data=f"keep_as_is:{food_name}"
    ))
    
    return keyboard

def create_food_variants_keyboard(food_name: str) -> Optional[InlineKeyboardMarkup]:
    """Создает клавиатуру с вариантами продуктов"""
    variants = get_popular_food_variants(food_name)
    
    if not variants:
        return None
    
    keyboard = InlineKeyboardMarkup()
    
    # Добавляем кнопки с вариантами (по 2 в ряд)
    for i in range(0, len(variants), 2):
        row = []
        for j in range(2):
            if i + j < len(variants):
                variant = variants[i + j]
                row.append(InlineKeyboardButton(
                    text=variant,
                    callback_data=f"food_variant:{variant}"
                ))
        keyboard.row(*row)
    
    # Добавляем кнопку "Другой вариант"
    keyboard.row(InlineKeyboardButton(
        text="Другой вариант",
        callback_data=f"food_other:{food_name}"
    ))
    
    return keyboard

def get_food_image(food_name: str) -> Optional[str]:
    """Получает путь к изображению еды из базы"""
    try:
        # Создаем папку для изображений если её нет
        images_dir = os.path.join(os.path.dirname(__file__), 'images')
        if not os.path.exists(images_dir):
            os.makedirs(images_dir)
            return None
        
        # Нормализуем название продукта для поиска файла
        normalized_name = food_name.lower().replace(' ', '_').replace('ё', 'е')
        
        # Ищем изображение по различным вариантам названия
        possible_names = [
            normalized_name,
            normalized_name.replace('_', ''),
            food_name.lower().replace(' ', ''),
            food_name.lower()
        ]
        
        # Расширения изображений
        extensions = ['.jpg', '.jpeg', '.png', '.gif', '.webp']
        
        for name in possible_names:
            for ext in extensions:
                image_path = os.path.join(images_dir, f"{name}{ext}")
                if os.path.exists(image_path):
                    return image_path
        
        # Если не найдено, возвращаем None
        return None
        
    except Exception as e:
        logger.error(f"Ошибка при поиске изображения для {food_name}: {e}")
        return None

def format_food_record(food_info: Dict[str, Any], record_id: int, user_id: int = None) -> str:
    """Форматирует запись о еде в красивое сообщение"""
    
    # Делаем название продукта с большой буквы
    food_name = food_info['food_name'].capitalize()
    
    # Получаем общую статистику за день если передан user_id
    daily_calories = 0
    if user_id:
        try:
            daily_stats = db_manager.get_daily_stats(user_id)
            daily_calories = daily_stats.get('total_calories', 0)
        except:
            pass
    
    text = f"""🍽️ Добавлено в дневник питания

Продукт: <b>{food_name}</b>
Количество: {food_info['amount']} {food_info['unit']}"""
    
    # Добавляем детализацию калорий для комплексных блюд
    calories_breakdown = get_calories_breakdown(food_name.lower())
    if calories_breakdown:
        text += f"\n\n📊 Детализация калорий:\n{calories_breakdown}"
    
    text += f"\n\n✚ {food_info['calories']:.0f} ккал"
    
    # Добавляем общую статистику за день
    if daily_calories > 0:
        text += f" [Сегодня {daily_calories:.0f} ккал]"
    
    return text

def get_calories_breakdown(food_name: str) -> str:
    """Возвращает детализацию калорий для комплексных блюд"""
    
    # Словарь с детализацией калорий для комплексных блюд
    breakdown_rules = {
        "пирог с яблоком и чаем": "🥧 Пирог с яблоком: 250 ккал\n☕ Чай: 50 ккал",
        "торт с кофе": "🍰 Торт: 350 ккал\n☕ Кофе: 50 ккал",
        "печенье с молоком": "🍪 Печенье: 150 ккал\n🥛 Молоко: 50 ккал",
        "круассан с кофе": "🥐 Круассан: 200 ккал\n☕ Кофе: 50 ккал",
        "пончик с чаем": "🍩 Пончик: 150 ккал\n☕ Чай: 50 ккал",
        "кекс с молоком": "🧁 Кекс: 250 ккал\n🥛 Молоко: 50 ккал",
        "картофель с мясом": "🥔 Картофель: 200 ккал\n🥩 Мясо: 200 ккал",
        "рис с мясом": "🍚 Рис: 150 ккал\n🥩 Мясо: 200 ккал",
        "макароны с сыром": "🍝 Макароны: 200 ккал\n🧀 Сыр: 100 ккал",
        "гречка с мясом": "🌾 Гречка: 150 ккал\n🥩 Мясо: 200 ккал",
        "овощи с мясом": "🥕 Овощи: 50 ккал\n🥩 Мясо: 200 ккал",
        "салат с мясом": "🥗 Салат: 30 ккал\n🥩 Мясо: 200 ккал",
        "суп с мясом": "🍲 Суп: 100 ккал\n🥩 Мясо: 100 ккал",
        "борщ с мясом": "🍲 Борщ: 120 ккал\n🥩 Мясо: 130 ккал",
        "плов": "🍚 Рис: 200 ккал\n🥩 Мясо: 200 ккал",
        "жаркое": "🥔 Картофель: 150 ккал\n🥩 Мясо: 200 ккал",
        "рагу": "🥕 Овощи: 100 ккал\n🥩 Мясо: 200 ккал",
        "тушеные овощи с мясом": "🥕 Овощи: 50 ккал\n🥩 Мясо: 200 ккал",
        "завтрак с кофе": "🍳 Завтрак: 350 ккал\n☕ Кофе: 50 ккал",
        "обед с супом": "🍽️ Обед: 400 ккал\n🍲 Суп: 100 ккал",
        "ужин с салатом": "🍽️ Ужин: 300 ккал\n🥗 Салат: 100 ккал",
        "перекус с чаем": "🍎 Перекус: 100 ккал\n☕ Чай: 50 ккал",
        "полдник с соком": "🍰 Полдник: 150 ккал\n🧃 Сок: 50 ккал",
        # Грузинские блюда
        "хачапури по аджарски и хинкали": "🥟 Хачапури по аджарски (1 шт): 400 ккал\n🥟 Хинкали (6 шт): 400 ккал",
        "хачапури по аджарски и хинкали 7 штук": "🥟 Хачапури по аджарски (1 шт): 400 ккал\n🥟 Хинкали (6 шт): 400 ккал",
        "хачапури и хинкали": "🥟 Хачапури (1 шт): 300 ккал\n🥟 Хинкали (5 шт): 350 ккал",
        "хачапури с хинкали": "🥟 Хачапури (1 шт): 300 ккал\n🥟 Хинкали (5 шт): 350 ккал",
        "хинкали и хачапури": "🥟 Хинкали (5 шт): 400 ккал\n🥟 Хачапури (1 шт): 300 ккал",
        "хинкали с хачапури": "🥟 Хинкали (5 шт): 400 ккал\n🥟 Хачапури (1 шт): 300 ккал",
        # Азиатские блюда
        "роллы и суши": "🍣 Роллы (6 шт): 300 ккал\n🍣 Суши (4 шт): 200 ккал",
        "роллы с суши": "🍣 Роллы (6 шт): 300 ккал\n🍣 Суши (4 шт): 200 ккал",
        "суши с роллами": "🍣 Суши (4 шт): 200 ккал\n🍣 Роллы (6 шт): 300 ккал",
        # Итальянские блюда
        "паста с салатом": "🍝 Паста: 400 ккал\n🥗 Салат: 100 ккал",
        "пицца с салатом": "🍕 Пицца (2 куска): 500 ккал\n🥗 Салат: 100 ккал",
        "ризотто с салатом": "🍚 Ризотто: 350 ккал\n🥗 Салат: 100 ккал",
        # Русские блюда
        "пельмени с салатом": "🥟 Пельмени (10 шт): 300 ккал\n🥗 Салат: 100 ккал",
        "вареники с салатом": "🥟 Вареники (8 шт): 250 ккал\n🥗 Салат: 100 ккал",
        "блины с начинкой": "🥞 Блины (3 шт): 300 ккал\n🥩 Начинка: 200 ккал",
        # Смешанные блюда
        "шашлык с овощами": "🥩 Шашлык (200г): 400 ккал\n🥕 Овощи: 100 ккал",
        "шашлык и овощи": "🥩 Шашлык (200г): 400 ккал\n🥕 Овощи: 100 ккал",
        "мясо с гарниром": "🥩 Мясо (200г): 300 ккал\n🍚 Гарнир: 200 ккал",
        "рыба с гарниром": "🐟 Рыба (200г): 250 ккал\n🍚 Гарнир: 200 ккал",
        # Фастфуд и комплексные блюда
        "бургер с картошкой": "🍔 Бургер (300г): 450 ккал\n🍟 Картошка фри (150г): 150 ккал",
        "бургер с картофелем": "🍔 Бургер (300г): 450 ккал\n🍟 Картошка фри (150г): 150 ккал",
        "бургер с фри": "🍔 Бургер (300г): 450 ккал\n🍟 Картошка фри (150г): 150 ккал",
        "бургер с картофелем фри": "🍔 Бургер (300г): 450 ккал\n🍟 Картошка фри (150г): 150 ккал",
        "кола и бургер": "🥤 Кола (250мл): 105 ккал\n🍔 Бургер (300г): 450 ккал",
        "кола бургер и картошка": "🥤 Кола (250мл): 105 ккал\n🍔 Бургер (300г): 450 ккал\n🍟 Картошка фри (150г): 150 ккал",
        "кола бургер и 2 мафина": "🥤 Кола (250мл): 105 ккал\n🍔 Бургер (300г): 450 ккал\n🧁 Мафины (2 шт): 200 ккал",
        "кола фри и бургер": "🥤 Кола (250мл): 105 ккал\n🍟 Картошка фри (150г): 150 ккал\n🍔 Бургер (300г): 450 ккал",
        # Комбинированные блюда с напитками и выпечкой
        "хинкали плюс чай и круассан": "🥟 Хинкали (5 шт): 300 ккал\n☕ Чай: 50 ккал\n🥐 Круассан: 200 ккал",
        "хинкали плюс чай и круассан": "🥟 Хинкали (5 шт): 300 ккал\n☕ Чай: 50 ккал\n🥐 Круассан: 200 ккал",
        "хинкали с чаем и круассаном": "🥟 Хинкали (5 шт): 300 ккал\n☕ Чай: 50 ккал\n🥐 Круассан: 200 ккал",
        "хинкали и чай и круассан": "🥟 Хинкали (5 шт): 300 ккал\n☕ Чай: 50 ккал\n🥐 Круассан: 200 ккал",
        "чапильгаш и хинкали плюс чай и круассан": "🥟 Чапильгаш (1 шт): 200 ккал\n🥟 Хинкали (4 шт): 240 ккал\n☕ Чай: 50 ккал\n🥐 Круассан: 200 ккал",
        "чапильгаш с хинкали плюс чай и круассан": "🥟 Чапильгаш (1 шт): 200 ккал\n🥟 Хинкали (4 шт): 240 ккал\n☕ Чай: 50 ккал\n🥐 Круассан: 200 ккал",
        "хачапури плюс чай и круассан": "🥟 Хачапури (1 шт): 300 ккал\n☕ Чай: 50 ккал\n🥐 Круассан: 200 ккал",
        "хачапури с чаем и круассаном": "🥟 Хачапури (1 шт): 300 ккал\n☕ Чай: 50 ккал\n🥐 Круассан: 200 ккал",
        "пельмени плюс чай и круассан": "🥟 Пельмени (8 шт): 300 ккал\n☕ Чай: 50 ккал\n🥐 Круассан: 200 ккал",
        "пельмени с чаем и круассаном": "🥟 Пельмени (8 шт): 300 ккал\n☕ Чай: 50 ккал\n🥐 Круассан: 200 ккал",
        "вареники плюс чай и круассан": "🥟 Вареники (6 шт): 250 ккал\n☕ Чай: 50 ккал\n🥐 Круассан: 200 ккал",
        "вареники с чаем и круассаном": "🥟 Вареники (6 шт): 250 ккал\n☕ Чай: 50 ккал\n🥐 Круассан: 200 ккал",
        "блины плюс чай и круассан": "🥞 Блины (3 шт): 300 ккал\n☕ Чай: 50 ккал\n🥐 Круассан: 200 ккал",
        "блины с чаем и круассаном": "🥞 Блины (3 шт): 300 ккал\n☕ Чай: 50 ккал\n🥐 Круассан: 200 ккал",
        "роллы плюс чай и круассан": "🍣 Роллы (6 шт): 300 ккал\n☕ Чай: 50 ккал\n🥐 Круассан: 200 ккал",
        "роллы с чаем и круассаном": "🍣 Роллы (6 шт): 300 ккал\n☕ Чай: 50 ккал\n🥐 Круассан: 200 ккал",
        "суши плюс чай и круассан": "🍣 Суши (4 шт): 200 ккал\n☕ Чай: 50 ккал\n🥐 Круассан: 200 ккал",
        "суши с чаем и круассаном": "🍣 Суши (4 шт): 200 ккал\n☕ Чай: 50 ккал\n🥐 Круассан: 200 ккал"
    }
    
    return breakdown_rules.get(food_name, "")

def format_top_foods(top_foods: list) -> str:
    """Форматирует топ продуктов"""
    if not top_foods:
        return "Нет данных"
    
    result = ""
    for i, food in enumerate(top_foods[:5], 1):
        result += f"{i}. {food['food_name']} - {food['count']} раз\n"
    
    return result

@bot.message_handler(func=lambda message: True)
def handle_unknown_message(message: Message):
    """Обработчик неизвестных сообщений"""
    bot.reply_to(message, 
                "🤔 Я не понимаю это сообщение.\n\n"
                "Отправьте голосовое сообщение с описанием еды или используйте команды:\n"
                "/help - помощь\n"
                "/stats - статистика")

def main():
    """Основная функция запуска бота"""
    logger.info("Запуск AI-КАЛОРИЯ бота...")
    
    try:
        # Инициализация базы данных
        db_manager.init_database()
        logger.info("База данных инициализирована")
        
        # Устанавливаем команды бота
        bot.set_my_commands([
            types.BotCommand("start", "🏠 Главное меню"),
            types.BotCommand("stats", "📊 Статистика питания"),
            types.BotCommand("diet", "🍽️ Просмотр рациона"),
            types.BotCommand("records", "📋 Все записи"),
            types.BotCommand("clear", "🗑️ Очистить историю"),
            types.BotCommand("help", "ℹ️ Помощь")
        ])
        logger.info("Команды бота установлены")
        
        # Запуск бота
        logger.info("Бот запущен и готов к работе!")
        bot.infinity_polling(timeout=10, long_polling_timeout=5)
        
    except Exception as e:
        logger.error(f"Критическая ошибка при запуске бота: {e}")
        raise
    finally:
        # Закрываем HTTP клиент если используется прокси
        try:
            openai_client.close()
        except:
            pass

@bot.callback_query_handler(func=lambda call: call.data.startswith('food_variant:'))
def handle_food_variant_callback(call):
    """Обработчик выбора варианта продукта"""
    try:
        user_id = call.from_user.id
        username = call.from_user.username or call.from_user.first_name
        
        # Извлекаем название продукта из callback_data
        food_name = call.data.split(':', 1)[1]
        
        logger.info(f"Пользователь {user_id} выбрал вариант: {food_name}")
        
        # Удаляем клавиатуру и редактируем сообщение
        bot.edit_message_text(
            f"🍽️ Обрабатываю {food_name}...",
            call.message.chat.id,
            call.message.message_id
        )
        
        # Отправляем сообщение о обработке
        processing_msg = bot.send_message(
            call.message.chat.id,
            f"🍽️ Обрабатываю {food_name}..."
        )
        
        # Анализируем выбранный продукт
        food_info = openai_client.analyze_food_intake(food_name)
        
        if not food_info or not food_info.get('success'):
            # Если анализ неуспешен, предлагаем гарниры или уточняем количество
            logger.warning(f"Не удалось проанализировать {food_name}, предлагаем гарниры")
            
            # Проверяем, есть ли гарниры для этого продукта
            side_dishes_keyboard = create_side_dishes_keyboard(food_name)
            if side_dishes_keyboard:
                # Показываем гарниры
                bot.edit_message_text(
                    f"🍽️ Выбрано: {food_name}\n\n🤔 Хотите добавить гарнир или дополнение?",
                    call.message.chat.id, 
                    processing_msg.message_id,
                    reply_markup=side_dishes_keyboard
                )
            else:
                # Если гарниров нет, просим уточнить количество
                bot.edit_message_text(
                    f"🍽️ Выбрано: {food_name}\n\n📏 Пожалуйста, укажите количество:\n• Например: '200 грамм', '1 порция', '2 штуки'",
                    call.message.chat.id, 
                    processing_msg.message_id
                )
                
                # Устанавливаем состояние ожидания количества
                user_states[user_id] = {
                    'state': UserState.WAITING_FOR_FOOD_INFO,
                    'action': 'waiting_for_quantity',
                    'selected_food': food_name
                }
            return
        
        # Сохраняем в базу данных
        record_id = db_manager.add_food_record(
            user_id=user_id,
            username=username,
            food_name=food_info['food_name'],
            amount=food_info['amount'],
            unit=food_info['unit'],
            calories=food_info['calories']
        )
        
        # Проверяем, нужно ли предложить гарниры
        side_dishes_keyboard = create_side_dishes_keyboard(food_info['food_name'])
        if side_dishes_keyboard:
            # Показываем гарниры
            bot.edit_message_text(
                f"🍽️ Добавлено: {food_info['food_name']}\n\n🤔 Хотите добавить гарнир или дополнение?",
                call.message.chat.id, 
                processing_msg.message_id,
                reply_markup=side_dishes_keyboard
            )
            return
        
        # Формируем красивое сообщение
        response_text = format_food_record(food_info, record_id, user_id)
        
        # Создаем клавиатуру с кнопками для управления записью
        keyboard = InlineKeyboardMarkup()
        keyboard.row(
            InlineKeyboardButton("✏️ Изменить", callback_data=f"edit_record:{record_id}"),
            InlineKeyboardButton("🗑️ Удалить", callback_data=f"delete_record:{record_id}")
        )
        
        # Отправляем изображение еды из базы
        try:
            image_path = get_food_image(food_info['food_name'])
            if image_path and os.path.exists(image_path):
                # Отправляем изображение с подписью
                with open(image_path, 'rb') as photo:
                    bot.send_photo(
                        chat_id=call.message.chat.id,
                        photo=photo,
                        caption=response_text,
                        reply_markup=keyboard,
                        parse_mode='HTML'
                    )
                # Удаляем сообщение о обработке
                bot.delete_message(call.message.chat.id, processing_msg.message_id)
            else:
                # Если изображение не найдено, отправляем только текст
                bot.edit_message_text(response_text, call.message.chat.id, processing_msg.message_id, 
                                   reply_markup=keyboard, parse_mode='HTML')
        except Exception as e:
            logger.error(f"Ошибка при отправке изображения: {e}")
            # Отправляем только текст если изображение не удалось
            bot.edit_message_text(response_text, call.message.chat.id, processing_msg.message_id, 
                               reply_markup=keyboard, parse_mode='HTML')
        
        logger.info(f"Успешно добавлена запись {record_id} для пользователя {user_id}")
        
    except Exception as e:
        logger.error(f"Ошибка при обработке callback: {e}")
        bot.answer_callback_query(call.id, "❌ Произошла ошибка. Попробуйте еще раз.")

@bot.callback_query_handler(func=lambda call: call.data.startswith('side_dish:'))
def handle_side_dish_callback(call):
    """Обработчик выбора гарнира"""
    try:
        user_id = call.from_user.id
        
        # Извлекаем название гарнира из callback_data
        side_dish = call.data.split(':', 1)[1]
        
        logger.info(f"Пользователь {user_id} выбрал гарнир: {side_dish}")
        
        # Удаляем клавиатуру и редактируем сообщение
        bot.edit_message_text(
            f"🍽️ Выбран гарнир: {side_dish}\n\n📏 Пожалуйста, укажите количество:\n• Например: '200 грамм', '1 порция', '2 штуки'",
            call.message.chat.id,
            call.message.message_id
        )
        
        # Устанавливаем состояние ожидания количества для гарнира
        user_states[user_id] = {
            'state': UserState.WAITING_FOR_FOOD_INFO,
            'action': 'waiting_for_side_dish_quantity',
            'selected_side_dish': side_dish
        }
        
    except Exception as e:
        logger.error(f"Ошибка при обработке гарнира: {e}")
        bot.answer_callback_query(call.id, "❌ Ошибка при обработке")

@bot.callback_query_handler(func=lambda call: call.data.startswith('keep_as_is:'))
def handle_keep_as_is_callback(call):
    """Обработчик кнопки 'Оставить как есть'"""
    try:
        user_id = call.from_user.id
        username = call.from_user.username or call.from_user.first_name
        
        # Извлекаем название продукта из callback_data
        food_name = call.data.split(':', 1)[1]
        
        logger.info(f"Пользователь {user_id} оставил как есть: {food_name}")
        
        # Удаляем клавиатуру и редактируем сообщение
        bot.edit_message_text(
            f"🍽️ Обрабатываю {food_name}...",
            call.message.chat.id,
            call.message.message_id
        )
        
        # Отправляем сообщение о обработке
        processing_msg = bot.send_message(
            call.message.chat.id,
            f"🍽️ Обрабатываю {food_name}..."
        )
        
        # Анализируем продукт как есть
        food_info = openai_client.analyze_food_intake(food_name)
        
        if not food_info or not food_info.get('success'):
            error_msg = food_info.get('message', 'Не удалось проанализировать информацию о еде.')
            bot.edit_message_text(f"❌ {error_msg}", call.message.chat.id, processing_msg.message_id)
            return
        
        # Сохраняем в базу данных
        record_id = db_manager.add_food_record(
            user_id=user_id,
            username=username,
            food_name=food_info['food_name'],
            amount=food_info['amount'],
            unit=food_info['unit'],
            calories=food_info['calories']
        )
        
        # Формируем красивое сообщение
        response_text = format_food_record(food_info, record_id, user_id)
        
        # Создаем клавиатуру с кнопками для управления записью
        keyboard = InlineKeyboardMarkup()
        keyboard.row(
            InlineKeyboardButton("✏️ Изменить", callback_data=f"edit_record:{record_id}"),
            InlineKeyboardButton("🗑️ Удалить", callback_data=f"delete_record:{record_id}")
        )
        
        # Отправляем финальное сообщение
        bot.edit_message_text(
            response_text,
            call.message.chat.id,
            processing_msg.message_id,
            reply_markup=keyboard,
            parse_mode='HTML'
        )
        
    except Exception as e:
        logger.error(f"Ошибка при обработке 'оставить как есть': {e}")
        bot.answer_callback_query(call.id, "❌ Ошибка при обработке")

@bot.callback_query_handler(func=lambda call: call.data.startswith('food_other:'))
def handle_food_other_callback(call):
    """Обработчик кнопки 'Другой вариант'"""
    try:
        # Извлекаем название продукта из callback_data
        food_name = call.data.split(':', 1)[1]
        
        # Удаляем клавиатуру
        bot.edit_message_reply_markup(
            chat_id=call.message.chat.id,
            message_id=call.message.message_id,
            reply_markup=None
        )
        
        # Отправляем сообщение с просьбой уточнить
        bot.edit_message_text(
            f"💬 Пожалуйста, уточните, какой именно {food_name.lower()} вы имели в виду.\n\nНапример:\n• '{food_name.lower()} с сахаром'\n• '{food_name.lower()} без сахара'\n• '{food_name.lower()} 200 грамм'",
            call.message.chat.id,
            call.message.message_id
        )
        
    except Exception as e:
        logger.error(f"Ошибка при обработке callback: {e}")
        bot.answer_callback_query(call.id, "❌ Произошла ошибка. Попробуйте еще раз.")

@bot.callback_query_handler(func=lambda call: call.data.startswith('diet_'))
def handle_diet_callback(call):
    """Обработчик callback для рациона"""
    try:
        user_id = call.from_user.id
        action = call.data.split('_', 1)[1]
        
        if action == "today":
            show_diet_for_date(call, user_id, "сегодня")
        elif action == "yesterday":
            show_diet_for_date(call, user_id, "вчера")
        elif action == "select_date":
            show_date_selection(call, user_id)
        elif action == "week":
            show_week_diet(call, user_id)
        elif action == "delete":
            show_delete_menu(call, user_id)
        elif action == "all_records":
            show_all_records_page(call, user_id, 1)
        else:
            bot.answer_callback_query(call.id, "❌ Неизвестное действие")
            
    except Exception as e:
        logger.error(f"Ошибка при обработке diet callback: {e}")
        bot.answer_callback_query(call.id, "❌ Произошла ошибка")

def show_diet_for_date(call, user_id: int, date_desc: str):
    """Показать рацион за конкретную дату"""
    try:
        from datetime import datetime, timedelta
        
        if date_desc == "сегодня":
            target_date = datetime.now().date()
        elif date_desc == "вчера":
            target_date = (datetime.now() - timedelta(days=1)).date()
        else:
            target_date = datetime.now().date()
        
        # Получаем записи за дату
        records = db_manager.get_user_records_by_date(user_id, target_date)
        
        if not records:
            bot.edit_message_text(
                f"📅 Рацион за {date_desc} пуст",
                call.message.chat.id,
                call.message.message_id
            )
            return
        
        # Формируем сообщение
        total_calories = sum(record['calories'] for record in records)
        text = f"🍽️ Рацион за {date_desc} ({target_date.strftime('%d.%m.%Y')})\n\n"
        
        for i, record in enumerate(records, 1):
            text += f"{i}. {record['food_name']} - {record['amount']} {record['unit']} ({record['calories']} ккал)\n"
            text += f"   ⏰ {record['created_at'].strftime('%H:%M')}\n\n"
        
        text += f"📊 Всего: {total_calories} ккал"
        
        # Создаем клавиатуру для удаления записей
        keyboard = InlineKeyboardMarkup()
        for i, record in enumerate(records[:10], 1):  # Показываем только первые 10
            keyboard.row(InlineKeyboardButton(
                f"🗑️ {i}. {record['food_name']}",
                callback_data=f"delete_record:{record['id']}"
            ))
        
        if len(records) > 10:
            keyboard.row(InlineKeyboardButton("📄 Показать еще", callback_data="diet_more"))
        
        keyboard.row(InlineKeyboardButton("🔙 Назад", callback_data="diet_back"))
        keyboard.row(InlineKeyboardButton("🏠 Главное меню", callback_data="menu_back"))
        
        bot.edit_message_text(text, call.message.chat.id, call.message.message_id, reply_markup=keyboard)
        
    except Exception as e:
        logger.error(f"Ошибка при показе рациона за {date_desc}: {e}")
        bot.edit_message_text("❌ Ошибка при загрузке рациона", call.message.chat.id, call.message.message_id)

def show_date_selection(call, user_id: int):
    """Показать выбор даты"""
    try:
        from datetime import datetime, timedelta
        
        keyboard = InlineKeyboardMarkup()
        
        # Добавляем кнопки для последних 7 дней
        for i in range(7):
            date = datetime.now() - timedelta(days=i)
            date_str = date.strftime('%d.%m')
            if i == 0:
                date_label = f"Сегодня ({date_str})"
            elif i == 1:
                date_label = f"Вчера ({date_str})"
            else:
                # Переводим дни недели на русский
                weekdays_ru = {
                    'Monday': 'Понедельник',
                    'Tuesday': 'Вторник', 
                    'Wednesday': 'Среда',
                    'Thursday': 'Четверг',
                    'Friday': 'Пятница',
                    'Saturday': 'Суббота',
                    'Sunday': 'Воскресенье'
                }
                weekday_ru = weekdays_ru.get(date.strftime('%A'), date.strftime('%A'))
                date_label = f"{weekday_ru} ({date_str})"
            
            keyboard.row(InlineKeyboardButton(
                date_label,
                callback_data=f"diet_date:{date.date()}"
            ))
        
        keyboard.row(InlineKeyboardButton("🔙 Назад", callback_data="diet_back"))
        keyboard.row(InlineKeyboardButton("🏠 Главное меню", callback_data="menu_back"))
        
        bot.edit_message_text(
            "📅 Выберите дату для просмотра рациона:",
            call.message.chat.id,
            call.message.message_id,
            reply_markup=keyboard
        )
        
    except Exception as e:
        logger.error(f"Ошибка при показе выбора даты: {e}")
        bot.edit_message_text("❌ Ошибка при загрузке дат", call.message.chat.id, call.message.message_id)

def show_week_diet(call, user_id: int):
    """Показать рацион за неделю"""
    try:
        from datetime import datetime, timedelta
        
        # Получаем записи за последние 7 дней
        week_records = {}
        total_calories = 0
        
        for i in range(7):
            date = (datetime.now() - timedelta(days=i)).date()
            records = db_manager.get_user_records_by_date(user_id, date)
            if records:
                week_records[date] = records
                total_calories += sum(record['calories'] for record in records)
        
        if not week_records:
            bot.edit_message_text(
                "📊 Рацион за неделю пуст",
                call.message.chat.id,
                call.message.message_id
            )
            return
        
        # Формируем сообщение
        text = "📊 Рацион за неделю\n\n"
        
        for date in sorted(week_records.keys(), reverse=True):
            records = week_records[date]
            day_calories = sum(record['calories'] for record in records)
            date_str = date.strftime('%d.%m.%Y')
            
            if date == datetime.now().date():
                day_label = f"Сегодня ({date_str})"
            elif date == (datetime.now() - timedelta(days=1)).date():
                day_label = f"Вчера ({date_str})"
            else:
                day_label = f"{date.strftime('%A')} ({date_str})"
            
            text += f"📅 {day_label}: {day_calories} ккал\n"
            for record in records[:3]:  # Показываем только первые 3 записи
                text += f"   • {record['food_name']} ({record['calories']} ккал)\n"
            if len(records) > 3:
                text += f"   • ... и еще {len(records) - 3} записей\n"
            text += "\n"
        
        text += f"📊 Всего за неделю: {total_calories} ккал"
        
        keyboard = InlineKeyboardMarkup()
        keyboard.row(InlineKeyboardButton("🔙 Назад", callback_data="diet_back"))
        keyboard.row(InlineKeyboardButton("🏠 Главное меню", callback_data="menu_back"))
        
        bot.edit_message_text(text, call.message.chat.id, call.message.message_id, reply_markup=keyboard)
        
    except Exception as e:
        logger.error(f"Ошибка при показе недельного рациона: {e}")
        bot.edit_message_text("❌ Ошибка при загрузке недельного рациона", call.message.chat.id, call.message.message_id)

def show_delete_menu(call, user_id: int):
    """Показать меню удаления записей"""
    try:
        # Получаем последние записи пользователя
        records = db_manager.get_user_recent_records(user_id, limit=10)
        
        if not records:
            bot.edit_message_text(
                "🗑️ Нет записей для удаления",
                call.message.chat.id,
                call.message.message_id
            )
            return
        
        text = "🗑️ Выберите запись для удаления:\n\n"
        
        keyboard = InlineKeyboardMarkup()
        for i, record in enumerate(records, 1):
            text += f"{i}. {record['food_name']} - {record['amount']} {record['unit']} ({record['calories']} ккал)\n"
            keyboard.row(InlineKeyboardButton(
                f"🗑️ {i}. {record['food_name']}",
                callback_data=f"delete_record:{record['id']}"
            ))
        
        keyboard.row(InlineKeyboardButton("🔙 Назад", callback_data="diet_back"))
        keyboard.row(InlineKeyboardButton("🏠 Главное меню", callback_data="menu_back"))
        
        bot.edit_message_text(text, call.message.chat.id, call.message.message_id, reply_markup=keyboard)
        
    except Exception as e:
        logger.error(f"Ошибка при показе меню удаления: {e}")
        bot.edit_message_text("❌ Ошибка при загрузке записей", call.message.chat.id, call.message.message_id)

@bot.callback_query_handler(func=lambda call: call.data.startswith('delete_record:'))
def handle_delete_record(call):
    """Обработчик удаления записи"""
    try:
        user_id = call.from_user.id
        record_id = int(call.data.split(':', 1)[1])
        
        # Удаляем запись
        success = db_manager.delete_food_record(record_id, user_id)
        
        if success:
            bot.answer_callback_query(call.id, "✅ Запись удалена")
            # Показываем главное меню
            keyboard = InlineKeyboardMarkup()
            keyboard.row(
                InlineKeyboardButton("📊 Статистика", callback_data="menu_stats"),
                InlineKeyboardButton("🍽️ Рацион", callback_data="menu_diet")
            )
            keyboard.row(
                InlineKeyboardButton("🗑️ Очистить историю", callback_data="menu_clear"),
                InlineKeyboardButton("ℹ️ Помощь", callback_data="menu_help")
            )
            keyboard.row(InlineKeyboardButton("🏠 Главное меню", callback_data="menu_back"))
            
            bot.edit_message_text(
                "✅ Запись успешно удалена!",
                call.message.chat.id,
                call.message.message_id,
                reply_markup=keyboard,
                parse_mode='HTML'
            )
        else:
            bot.answer_callback_query(call.id, "❌ Запись не найдена")
            
    except Exception as e:
        logger.error(f"Ошибка при удалении записи: {e}")
        bot.answer_callback_query(call.id, "❌ Ошибка при удалении")

@bot.callback_query_handler(func=lambda call: call.data.startswith('diet_date:'))
def handle_diet_date(call):
    """Обработчик выбора конкретной даты"""
    try:
        user_id = call.from_user.id
        date_str = call.data.split(':', 1)[1]
        
        from datetime import datetime
        target_date = datetime.strptime(date_str, '%Y-%m-%d').date()
        
        # Показываем рацион за выбранную дату
        show_diet_for_date(call, user_id, target_date.strftime('%d.%m.%Y'))
        
    except Exception as e:
        logger.error(f"Ошибка при обработке выбора даты: {e}")
        bot.answer_callback_query(call.id, "❌ Ошибка при загрузке даты")

@bot.callback_query_handler(func=lambda call: call.data == 'diet_back')
def handle_diet_back(call):
    """Обработчик кнопки 'Назад'"""
    try:
        # Возвращаемся к главному меню рациона
        keyboard = InlineKeyboardMarkup()
        keyboard.row(
            InlineKeyboardButton("📅 Сегодня", callback_data="diet_today"),
            InlineKeyboardButton("📅 Вчера", callback_data="diet_yesterday")
        )
        keyboard.row(
            InlineKeyboardButton("📅 Выбрать дату", callback_data="diet_select_date"),
            InlineKeyboardButton("📊 За неделю", callback_data="diet_week")
        )
        keyboard.row(
            InlineKeyboardButton("🗑️ Удалить запись", callback_data="diet_delete")
        )
        
        bot.edit_message_text(
            "🍽️ Выберите период для просмотра рациона:",
            call.message.chat.id,
            call.message.message_id,
            reply_markup=keyboard
        )
        
    except Exception as e:
        logger.error(f"Ошибка при возврате в меню: {e}")
        bot.answer_callback_query(call.id, "❌ Ошибка при возврате")

@bot.callback_query_handler(func=lambda call: call.data.startswith('records_page:'))
def handle_records_page(call):
    """Обработчик пагинации записей"""
    try:
        user_id = call.from_user.id
        page = int(call.data.split(':', 1)[1])
        
        show_all_records_page(call, user_id, page)
        
    except Exception as e:
        logger.error(f"Ошибка при обработке страницы записей: {e}")
        bot.answer_callback_query(call.id, "❌ Ошибка при загрузке страницы")

@bot.callback_query_handler(func=lambda call: call.data.startswith('view_record:'))
def handle_view_record(call):
    """Обработчик просмотра отдельной записи"""
    try:
        user_id = call.from_user.id
        record_id = int(call.data.split(':', 1)[1])
        
        # Получаем запись
        record = db_manager.get_record_by_id(record_id, user_id)
        if not record:
            bot.answer_callback_query(call.id, "❌ Запись не найдена")
            return
        
        # Формируем сообщение
        time_str = record['created_at'].strftime('%H:%M')
        text = f"📋 **Запись #{record_id}**\n\n"
        text += f"🍽️ **Продукт:** {record['food_name']}\n"
        text += f"📏 **Количество:** {record['amount']} {record['unit']}\n"
        text += f"🔥 **Калории:** {record['calories']} ккал\n"
        text += f"🕐 **Время:** {time_str}\n"
        
        # Создаем клавиатуру
        keyboard = InlineKeyboardMarkup()
        keyboard.row(
            InlineKeyboardButton("✏️ Изменить", callback_data=f"edit_record:{record_id}"),
            InlineKeyboardButton("🗑️ Удалить", callback_data=f"delete_record:{record_id}")
        )
        keyboard.row(InlineKeyboardButton("⬅️ Назад к списку", callback_data="records_page:1"))
        
        bot.edit_message_text(
            text,
            call.message.chat.id,
            call.message.message_id,
            reply_markup=keyboard,
            parse_mode='Markdown'
        )
        
    except Exception as e:
        logger.error(f"Ошибка при просмотре записи: {e}")
        bot.answer_callback_query(call.id, "❌ Ошибка при просмотре записи")

def show_all_records_page(call, user_id: int, page: int):
    """Показать страницу со всеми записями"""
    try:
        # Получаем данные для страницы
        data = db_manager.get_user_records_paginated(user_id, page=page, per_page=10)
        
        if not data['records']:
            bot.edit_message_text(
                "📝 У вас пока нет записей о еде.",
                call.message.chat.id,
                call.message.message_id
            )
            return
        
        # Формируем сообщение
        text = f"📋 **Все записи** (страница {data['pagination']['current_page']}/{data['pagination']['total_pages']})\n\n"
        
        for i, record in enumerate(data['records'], 1):
            time_str = record['created_at'].strftime('%H:%M')
            text += f"{i}. **{record['food_name']}** - {record['amount']} {record['unit']} ({record['calories']} ккал) 🕐 {time_str}\n"
        
        # Создаем клавиатуру
        keyboard = InlineKeyboardMarkup()
        
        # Добавляем кнопки для каждой записи (максимум 5 на страницу для удобства)
        for i, record in enumerate(data['records'][:5], 1):
            keyboard.row(InlineKeyboardButton(
                f"{i}. {record['food_name']} - {record['calories']} ккал",
                callback_data=f"view_record:{record['id']}"
            ))
        
        # Если записей больше 5, добавляем кнопку "Показать еще"
        if len(data['records']) > 5:
            keyboard.row(InlineKeyboardButton("📋 Показать еще", callback_data=f"show_more_records:{page}"))
        
        # Кнопки навигации
        nav_buttons = []
        if data['pagination']['has_prev']:
            nav_buttons.append(InlineKeyboardButton("⬅️ Назад", callback_data=f"records_page:{data['pagination']['current_page']-1}"))
        if data['pagination']['has_next']:
            nav_buttons.append(InlineKeyboardButton("Вперед ➡️", callback_data=f"records_page:{data['pagination']['current_page']+1}"))
        
        if nav_buttons:
            keyboard.row(*nav_buttons)
        
        # Кнопка главного меню
        keyboard.row(InlineKeyboardButton("🏠 Главное меню", callback_data="menu_back"))
        
        bot.edit_message_text(
            text,
            call.message.chat.id,
            call.message.message_id,
            reply_markup=keyboard,
            parse_mode='Markdown'
        )
        
    except Exception as e:
        logger.error(f"Ошибка при показе страницы записей: {e}")
        bot.answer_callback_query(call.id, "❌ Ошибка при загрузке записей")

@bot.callback_query_handler(func=lambda call: call.data.startswith('menu_'))
def handle_main_menu(call):
    """Обработчик главного меню"""
    try:
        user_id = call.from_user.id
        action = call.data.split('_', 1)[1]
        
        if action == "stats":
            # Показываем статистику
            try:
                daily_stats = db_manager.get_daily_stats(user_id)
                total_calories = daily_stats.get('total_calories', 0)
                records_count = daily_stats.get('records_count', 0)
                
                text = f"""📊 **Ваша статистика за сегодня**

🔥 **Калории:** {total_calories:.0f} ккал
📝 **Записей:** {records_count}
📅 **Дата:** {datetime.now().strftime('%d.%m.%Y')}

💡 **Советы:**
• Норма для взрослого: 2000-2500 ккал/день
• Пейте больше воды
• Ешьте регулярно"""
                
                keyboard = InlineKeyboardMarkup()
                keyboard.row(InlineKeyboardButton("🔙 Главное меню", callback_data="menu_back"))
                
                bot.edit_message_text(text, call.message.chat.id, call.message.message_id, 
                                    reply_markup=keyboard, parse_mode='Markdown')
                
            except Exception as e:
                logger.error(f"Ошибка при получении статистики: {e}")
                bot.answer_callback_query(call.id, "❌ Ошибка при загрузке статистики")
                
        elif action == "diet":
            # Показываем меню рациона
            keyboard = InlineKeyboardMarkup()
            keyboard.row(
                InlineKeyboardButton("📅 Сегодня", callback_data="diet_today"),
                InlineKeyboardButton("📅 Вчера", callback_data="diet_yesterday")
            )
            keyboard.row(
                InlineKeyboardButton("📅 Выбрать дату", callback_data="diet_select_date"),
                InlineKeyboardButton("📊 За неделю", callback_data="diet_week")
            )
            keyboard.row(
                InlineKeyboardButton("🗑️ Удалить запись", callback_data="diet_delete")
            )
            keyboard.row(InlineKeyboardButton("🔙 Главное меню", callback_data="menu_back"))
            
            bot.edit_message_text(
                "🍽️ Выберите период для просмотра рациона:",
                call.message.chat.id,
                call.message.message_id,
                reply_markup=keyboard
            )
            
        elif action == "clear":
            # Показываем подтверждение очистки
            keyboard = InlineKeyboardMarkup()
            keyboard.row(
                InlineKeyboardButton("✅ Да, очистить", callback_data=f"clear_yes_{user_id}"),
                InlineKeyboardButton("❌ Отмена", callback_data="menu_back")
            )
            
            bot.edit_message_text(
                "⚠️ **Вы уверены, что хотите удалить всю историю записей?**\n\nЭто действие нельзя отменить!",
                call.message.chat.id,
                call.message.message_id,
                reply_markup=keyboard,
                parse_mode='Markdown'
            )
            
        elif action == "help":
            # Показываем помощь
            help_text = """ℹ️ **Помощь по AI-КАЛОРИЯ**

📝 **Как пользоваться:**
• Отправьте голосовое сообщение о том, что съели
• Или напишите текстом: "Съел тарелку гречки 300 грамм"
• Я проанализирую и добавлю в ваш дневник питания

🎯 **Доступные команды:**
• /start - Главное меню
• /stats - Статистика питания
• /diet - Просмотр рациона
• /clear - Очистка истории

💡 **Примеры запросов:**
• "Съел тарелку гречки 300 грамм"
• "Выпил стакан молока"
• "Капучино"
• "Овсянка с молоком"

🚀 **Готов к работе!**"""
            
            keyboard = InlineKeyboardMarkup()
            keyboard.row(InlineKeyboardButton("🔙 Главное меню", callback_data="menu_back"))
            
            bot.edit_message_text(help_text, call.message.chat.id, call.message.message_id, 
                                reply_markup=keyboard, parse_mode='Markdown')
            
        elif action == "back":
            # Возвращаемся к главному меню
            keyboard = InlineKeyboardMarkup()
            keyboard.row(
                InlineKeyboardButton("📊 Статистика", callback_data="menu_stats"),
                InlineKeyboardButton("🍽️ Рацион", callback_data="menu_diet")
            )
            keyboard.row(
                InlineKeyboardButton("🗑️ Очистить историю", callback_data="menu_clear"),
                InlineKeyboardButton("ℹ️ Помощь", callback_data="menu_help")
            )
            
            bot.edit_message_text(
                "🍎 **AI-КАЛОРИЯ - Главное меню**\n\n🎯 **Выберите действие:**",
                call.message.chat.id,
                call.message.message_id,
                reply_markup=keyboard,
                parse_mode='Markdown'
            )
            
    except Exception as e:
        logger.error(f"Ошибка при обработке главного меню: {e}")
        bot.answer_callback_query(call.id, "❌ Произошла ошибка")

@bot.callback_query_handler(func=lambda call: call.data.startswith('edit_record:'))
def handle_edit_record(call):
    """Обработчик изменения записи"""
    try:
        user_id = call.from_user.id
        record_id = int(call.data.split(':', 1)[1])
        
        # Получаем информацию о записи
        record = db_manager.get_record_by_id(record_id, user_id)
        if not record:
            bot.answer_callback_query(call.id, "❌ Запись не найдена")
            return
        
        # Показываем форму для изменения
        text = f"""✏️ <b>Изменение записи</b>

🍽️ <b>Продукт:</b> {record['food_name']}
📏 <b>Количество:</b> {record['amount']} {record['unit']}
🔥 <b>Текущие калории:</b> {record['calories']} ккал

💡 <b>Варианты изменения:</b>
• Введите новое количество калорий (например: 150, 200, 300)
• Или опишите изменения текстом (например: "увеличить до 250 калорий", "сделать меньше")"""
        
        keyboard = InlineKeyboardMarkup()
        keyboard.row(InlineKeyboardButton("❌ Отмена", callback_data="edit_cancel"))
        
        bot.send_message(
            call.message.chat.id,
            text,
            reply_markup=keyboard,
            parse_mode='HTML'
        )
        
        # Сохраняем состояние ожидания ввода калорий
        user_states[user_id] = {
            'state': UserState.WAITING_FOR_FOOD_INFO,
            'action': 'edit_calories',
            'record_id': record_id
        }
        
    except Exception as e:
        logger.error(f"Ошибка при изменении записи: {e}")
        bot.answer_callback_query(call.id, "❌ Ошибка при изменении")

@bot.callback_query_handler(func=lambda call: call.data == 'edit_cancel')
def handle_edit_cancel(call):
    """Обработчик отмены изменения"""
    try:
        user_id = call.from_user.id
        
        # Сбрасываем состояние
        user_states.pop(user_id, None)
        
        # Возвращаемся к главному меню
        keyboard = InlineKeyboardMarkup()
        keyboard.row(
            InlineKeyboardButton("📊 Статистика", callback_data="menu_stats"),
            InlineKeyboardButton("🍽️ Рацион", callback_data="menu_diet")
        )
        keyboard.row(
            InlineKeyboardButton("🗑️ Очистить историю", callback_data="menu_clear"),
            InlineKeyboardButton("ℹ️ Помощь", callback_data="menu_help")
        )
        
        bot.edit_message_text(
            "🍎 **AI-КАЛОРИЯ - Главное меню**\n\n🎯 **Выберите действие:**",
            call.message.chat.id,
            call.message.message_id,
            reply_markup=keyboard,
            parse_mode='Markdown'
        )
        
    except Exception as e:
        logger.error(f"Ошибка при отмене изменения: {e}")
        bot.answer_callback_query(call.id, "❌ Ошибка при отмене")

def handle_calories_edit(user_id: int, text: str, record_id: int):
    """Обработка умного изменения записи"""
    try:
        # Получаем текущую запись
        current_record = db_manager.get_record_by_id(record_id, user_id)
        if not current_record:
            return "❌ Запись не найдена"
        
        # Сначала пытаемся распарсить как число (только калории)
        try:
            new_calories = float(text.strip())
            if new_calories < 0:
                return "❌ Количество калорий не может быть отрицательным"
            if new_calories > 10000:
                return "❌ Количество калорий слишком большое (максимум 10000)"
            
            # Если это число, обновляем только калории
            success = db_manager.update_record_calories(record_id, user_id, new_calories)
            if not success:
                return "❌ Ошибка при обновлении записи"
            
        except ValueError:
            # Если не число, используем ИИ для умного понимания
            try:
                # Используем новую умную функцию редактирования
                changes = openai_client.smart_record_edit(text, current_record)
                if changes is None:
                    return "❌ Не удалось понять ваше изменение. Попробуйте ввести число или более четкое описание."
                
                # Если изменилось количество, но не указаны калории, пересчитываем калории пропорционально
                if 'amount' in changes and 'calories' not in changes:
                    old_amount = current_record['amount']
                    new_amount = changes['amount']
                    old_calories = current_record['calories']
                    
                    # Специальная логика для комплексных блюд с детализацией
                    if ' и ' in current_record['food_name'].lower():
                        # Для комплексных блюд используем более точный пересчет
                        # Если пользователь указал конкретное количество компонента
                        if 'шт' in changes.get('unit', '') or 'штук' in changes.get('unit', ''):
                            # Для штук используем базовую калорийность компонента
                            if 'хинкали' in current_record['food_name'].lower():
                                # Хинкали: примерно 80 ккал за штуку
                                new_calories = new_amount * 80
                                # Добавляем калории от хачапури (примерно 300 ккал)
                                if 'хачапури' in current_record['food_name'].lower():
                                    new_calories += 300
                            elif 'хачапури' in current_record['food_name'].lower():
                                # Хачапури: примерно 300 ккал за штуку
                                new_calories = new_amount * 300
                                # Добавляем калории от хинкали (примерно 5 штук по 80 ккал)
                                if 'хинкали' in current_record['food_name'].lower():
                                    new_calories += 400
                            else:
                                # Для других комплексных блюд используем пропорциональный пересчет
                                new_calories = (old_calories * new_amount) / old_amount
                        else:
                            # Для других единиц измерения используем пропорциональный пересчет
                            new_calories = (old_calories * new_amount) / old_amount
                    else:
                        # Для простых блюд используем пропорциональный пересчет
                        new_calories = (old_calories * new_amount) / old_amount
                    
                    changes['calories'] = round(new_calories, 1)
                    
                    logger.info(f"Пересчет калорий: {old_amount} -> {new_amount}, {old_calories} -> {new_calories}")
                
                # Обновляем запись с изменениями
                success = db_manager.update_record(record_id, user_id, changes)
                if not success:
                    return "❌ Ошибка при обновлении записи"
                
            except Exception as e:
                logger.error(f"Ошибка при умном редактировании: {e}")
                return "❌ Ошибка при обработке изменения. Попробуйте ввести число калорий."
        
        # Получаем обновленную запись
        updated_record = db_manager.get_record_by_id(record_id, user_id)
        
        # Формируем сообщение с обновленной информацией
        response_text = format_food_record({
            'food_name': updated_record['food_name'],
            'amount': updated_record['amount'],
            'unit': updated_record['unit'],
            'calories': updated_record['calories']
        }, record_id, user_id)
        
        # Создаем клавиатуру с кнопками
        keyboard = InlineKeyboardMarkup()
        keyboard.row(
            InlineKeyboardButton("✏️ Изменить", callback_data=f"edit_record:{record_id}"),
            InlineKeyboardButton("🗑️ Удалить", callback_data=f"delete_record:{record_id}")
        )
        
        return {
            'success': True,
            'text': response_text,
            'keyboard': keyboard
        }
            
    except Exception as e:
        logger.error(f"Ошибка при обработке изменения записи: {e}")
        return "❌ Произошла ошибка при изменении записи"

if __name__ == '__main__':
    main()
