#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Модуль для работы с OpenAI API в AI-КАЛОРИЯ боте
"""

import logging
import json
import io
import httpx
from typing import Dict, Any, Optional, List
import openai
from openai import OpenAI

from config import Config

logger = logging.getLogger(__name__)

class OpenAIClient:
    """Клиент для работы с OpenAI API"""
    
    def __init__(self, api_key: str):
        """Инициализация клиента OpenAI"""
        self.config = Config.get_openai_config()
        self.proxy_config = Config.get_proxy_config()
        
        # Настройка прокси если включен
        if self.proxy_config['enabled']:
            proxy_url = f"http://{self.proxy_config['login']}:{self.proxy_config['password']}@{self.proxy_config['server']}:{self.proxy_config['port']}"
            logger.info(f"Используется прокси: {self.proxy_config['server']}:{self.proxy_config['port']}")
            
            # Создаем HTTP клиент с прокси
            self.http_client = httpx.Client(
                proxies=proxy_url,
                timeout=30.0
            )
            
            # Инициализируем OpenAI клиент с кастомным HTTP клиентом
            self.client = OpenAI(
                api_key=api_key,
                http_client=self.http_client
            )
        else:
            self.client = OpenAI(api_key=api_key)
            self.http_client = None
        
        logger.info("OpenAI клиент инициализирован")
    
    def speech_to_text(self, audio_data: bytes) -> Optional[str]:
        """Конвертация голосового сообщения в текст"""
        try:
            # Создаем файловый объект из байтов
            audio_file = io.BytesIO(audio_data)
            audio_file.name = "voice.ogg"
            
            # Отправляем запрос к Whisper API
            transcript = self.client.audio.transcriptions.create(
                model=self.config['whisper_model'],
                file=audio_file,
                language="ru"  # Указываем русский язык
            )
            
            text = transcript.text.strip()
            logger.info(f"Распознан текст: {text}")
            
            return text if text else None
            
        except Exception as e:
            logger.error(f"Ошибка при распознавании речи: {e}")
            return None
    
    def analyze_food_intake(self, text: str) -> Dict[str, Any]:
        """Анализ текста с описанием еды с помощью GPT"""
        try:
            # Сначала пытаемся умно обработать запрос
            processed_text = self.smart_request_processing(text)
            logger.info(f"Обработанный текст: {processed_text}")
            
            # Теперь анализируем обработанный текст
            return self._analyze_food_intake_internal(processed_text)
            
        except Exception as e:
            logger.error(f"Ошибка при анализе еды: {e}")
            return {
                "success": False,
                "message": "Ошибка при обработке запроса"
            }
    
    def smart_request_processing(self, text: str) -> str:
        """Умная обработка запроса с попыткой исправления"""
        try:
            system_prompt = """
Ты - умный помощник по анализу запросов о еде. Твоя задача - понять и исправить запрос пользователя, если он некорректен или неполный.

ПРАВИЛА ОБРАБОТКИ:
1. Если запрос понятен и корректен - верни его как есть
2. Если запрос неполный - попытайся дополнить его логично
3. Если запрос некорректен - исправь его
4. Если запрос неясен - попытайся угадать наиболее вероятное значение
5. Всегда возвращай ТОЛЬКО исправленный запрос, без дополнительных комментариев

ПРИМЕРЫ:
"йогурт экспонента" -> "йогурт экспонента"
"съел яблоко" -> "яблоко"
"выпил стакан молока" -> "стакан молока"
"капучино" -> "капучино"
"овсянка" -> "овсянка"
"гречка с молоком" -> "гречка с молоком"
"непонятный текст" -> "овсянка" (если это наиболее вероятно)
"""
            
            user_prompt = f"Обработай и исправь этот запрос о еде: {text}"
            
            response = self.client.chat.completions.create(
                model=self.config['model'],
                messages=[
                    {"role": "system", "content": system_prompt},
                    {"role": "user", "content": user_prompt}
                ],
                max_tokens=100,
                temperature=0.3
            )
            
            processed_text = response.choices[0].message.content.strip()
            return processed_text
            
        except Exception as e:
            logger.error(f"Ошибка при умной обработке запроса: {e}")
            return text  # Возвращаем исходный текст если обработка не удалась
    
    def _analyze_food_intake_internal(self, text: str) -> Dict[str, Any]:
        """Внутренний метод анализа еды"""
        try:
            # Системный промпт для анализа еды
            system_prompt = """
Ты - эксперт по питанию и анализу еды. Твоя задача - анализировать сообщения пользователей о том, что они съели или выпили, и извлекать структурированную информацию.

ВАЖНО: Отвечай ТОЛЬКО в формате JSON. Никакого дополнительного текста.

Формат ответа:
{
    "success": true/false,
    "food_name": "название продукта",
    "amount": число,
    "unit": "единица измерения",
    "calories": число,
    "message": "сообщение об ошибке (если success=false)"
}

Правила анализа:
1. Если в сообщении нет информации о количестве - success=false, message="Укажите количество (граммы, миллилитры, штуки)"
2. Если не понятно что съели - success=false, message="Укажите что именно вы съели"
3. Если информации достаточно - success=true, извлеки данные
4. Для калорий используй средние значения для продуктов
5. Единицы измерения: "г", "мл", "шт", "кусок", "порция"
6. Название продукта должно быть понятным и конкретным

СПЕЦИАЛЬНЫЕ ПРАВИЛА ДЛЯ РАЗМЕРОВ ПОРЦИЙ:
- "тарелка" или "миска" = 350 мл
- "маленькая порция" = 250 мл  
- "большая порция" = 500 мл
- "стакан" = 250 мл
- "чашка" = 200 мл
- "ложка" = 15 мл
- "столовая ложка" = 15 мл
- "чайная ложка" = 5 мл

ПРАВИЛА ДЛЯ ШТУЧНЫХ ПРОДУКТОВ:
- Если указано количество в штуках (шт), используй "шт" как единицу измерения
- Для роллов: 1 ролл = примерно 50-80 ккал
- Для пиццы: 1 кусок = примерно 200-300 ккал
- Для бутербродов: 1 штука = примерно 150-250 ккал

ПРИОРИТЕТНЫЕ ПРАВИЛА:
- Если в запросе есть слово "калорий" или "ккал", используй указанное пользователем количество калорий
- Если пользователь сам указал точное количество калорий, это имеет приоритет над стандартными значениями
- Пример: "овсянка 200 калорий" -> используй 200 ккал, а не стандартные 150

ПРАВИЛА ДЛЯ НЕУКАЗАННОГО КОЛИЧЕСТВА:
- Если продукт назван без указания количества, считай как 1 порцию
- "квашеная капуста" = 1 порция (примерно 200г)
- "салат" = 1 порция (примерно 200г)
- "овощи" = 1 порция (примерно 200г)
- "яблоко" = 1 штука (примерно 150г)
- "банан" = 1 штука (примерно 120г)
- "мороженное" = 1 порция (примерно 100г)
- "суп" = 1 порция (примерно 250мл)
- "чай" = 1 чашка (примерно 200мл, 50 ккал)
- "кофе" = 1 чашка (примерно 200мл, 50 ккал)

ПРАВИЛА ДЛЯ ГОТОВЫХ БЛЮД:
- Если блюдо содержит несколько ингредиентов (например, "картофель с мясом", "рис с овощами"), считай как 1 полную порцию готового блюда
- "картофель с мясом" = 1 порция (примерно 300г, 400 ккал)
- "рис с мясом" = 1 порция (примерно 300г, 350 ккал)
- "макароны с сыром" = 1 порция (примерно 250г, 300 ккал)
- "гречка с мясом" = 1 порция (примерно 250г, 300 ккал)
- "овощи с мясом" = 1 порция (примерно 300г, 250 ккал)
- "салат с мясом" = 1 порция (примерно 200г, 200 ккал)
- "суп с мясом" = 1 порция (примерно 300мл, 200 ккал)
- "борщ с мясом" = 1 порция (примерно 300мл, 250 ккал)
- "плов" = 1 порция (примерно 300г, 400 ккал)
- "жаркое" = 1 порция (примерно 300г, 350 ккал)
- "рагу" = 1 порция (примерно 300г, 300 ккал)
- "тушеные овощи с мясом" = 1 порция (примерно 300г, 250 ккал)

ПРАВИЛА ДЛЯ ФАСТФУДА И КОМПЛЕКСНЫХ БЛЮД:
- "бургер с картошкой" = 1 порция (примерно 300г + 150г картошки, 600 ккал)
- "бургер с картофелем" = 1 порция (примерно 300г + 150г картошки, 600 ккал)
- "бургер с фри" = 1 порция (примерно 300г + 150г картошки, 600 ккал)
- "бургер с картофелем фри" = 1 порция (примерно 300г + 150г картошки, 600 ккал)
- "кола и бургер" = 1 порция (примерно 250мл колы + 300г бургера, 500 ккал)
- "кола бургер и картошка" = 1 порция (примерно 250мл + 300г + 150г, 700 ккал)
- "кола бургер и 2 мафина" = 1 порция (примерно 250мл + 300г + 2×100г, 800 ккал)
- "кола фри и бургер" = 1 порция (примерно 250мл + 150г + 300г, 700 ккал)

ПРАВИЛА ДЛЯ ДЕСЕРТОВ И ВЫПЕЧКИ:
- "пирог с яблоком" = 1 порция (примерно 150г, 300 ккал)
- "пирог с яблоком и чаем" = 1 порция (примерно 150г + 200мл чая, 300 ккал)
- "торт с кофе" = 1 порция (примерно 100г + 200мл кофе, 400 ккал)
- "печенье с молоком" = 1 порция (примерно 50г + 200мл молока, 200 ккал)
- "блины с вареньем" = 1 порция (примерно 200г, 350 ккал)
- "оладьи с медом" = 1 порция (примерно 150г, 250 ккал)
- "вафли с сиропом" = 1 порция (примерно 100г, 300 ккал)
- "круассан с кофе" = 1 порция (примерно 60г + 200мл кофе, 250 ккал)
- "пончик с чаем" = 1 порция (примерно 80г + 200мл чая, 200 ккал)
- "кекс с молоком" = 1 порция (примерно 100г + 200мл молока, 300 ккал)

ПРАВИЛА ДЛЯ КОМБИНИРОВАННЫХ БЛЮД:
- Если блюдо содержит несколько компонентов (например, "пирог с яблоком и чаем"), считай как 1 полную порцию комплексного блюда
- "завтрак с кофе" = 1 порция (примерно 300г + 200мл кофе, 400 ккал)
- "обед с супом" = 1 порция (примерно 400г + 300мл супа, 500 ккал)
- "ужин с салатом" = 1 порция (примерно 300г + 200г салата, 400 ккал)
- "перекус с чаем" = 1 порция (примерно 100г + 200мл чая, 150 ккал)
- "полдник с соком" = 1 порция (примерно 150г + 250мл сока, 200 ккал)

ПРАВИЛА ДЛЯ ОТДЕЛЬНЫХ КОМПОНЕНТОВ:
- Если пользователь указывает количество для отдельного компонента (например, "5 шт хинкали"), считай только этот компонент
- "5 шт хинкали" = 5 штук хинкали (примерно 5 х 80 ккал = 400 ккал)
- "3 шт хачапури" = 3 штуки хачапури (примерно 3 х 300 ккал = 900 ккал)
- "2 шт пельмени" = 2 штуки пельмени (примерно 2 х 30 ккал = 60 ккал)
- "4 шт роллы" = 4 штуки роллов (примерно 4 х 50 ккал = 200 ккал)
- "6 шт суши" = 6 штук суши (примерно 6 х 50 ккал = 300 ккал)
- "2 шт блины" = 2 штуки блинов (примерно 2 х 100 ккал = 200 ккал)
- "3 шт вареники" = 3 штуки вареников (примерно 3 х 40 ккал = 120 ккал)
- "флэт вайт" = 1 порция (примерно 200мл)
- "капучино" = 1 порция (примерно 200мл)
- "латте" = 1 порция (примерно 200мл)
- "эспрессо" = 1 порция (примерно 30мл)
- "американо" = 1 порция (примерно 200мл)
- "макиато" = 1 порция (примерно 200мл)
- "мокко" = 1 порция (примерно 200мл)
- "фраппе" = 1 порция (примерно 200мл)
- "овсянка" = 1 порция (примерно 200г)
- "гречка с молоком" = 1 порция (примерно 250г)
- "рис с молоком" = 1 порция (примерно 250г)
- "манная каша" = 1 порция (примерно 200г)
- "пшенная каша" = 1 порция (примерно 200г)
- "перловая каша" = 1 порция (примерно 200г)
- "ячневая каша" = 1 порция (примерно 200г)
- "кукурузная каша" = 1 порция (примерно 200г)
- "булгур" = 1 порция (примерно 200г)
- "киноа" = 1 порция (примерно 200г)
- "йогурт" = 1 порция (примерно 150г)
- "кефир" = 1 стакан (примерно 250мл)
- "ряженка" = 1 стакан (примерно 250мл)
- "сметана" = 1 порция (примерно 50г)
- "творог" = 1 порция (примерно 200г)
- "сыр" = 1 порция (примерно 50г)
- "масло" = 1 порция (примерно 10г)

ПРАВИЛА ДЛЯ РАЗМЕРОВ:
- Если есть размер (стаканчик, порция, кусок, тарелка), используй его
- "стаканчик мороженного" = 1 стаканчик
- "порция салата" = 1 порция
- "кусок пиццы" = 1 кусок
- "тарелка супа" = 1 тарелка (350 мл)
- "стакан сока" = 1 стакан (250 мл)

ДОПОЛНИТЕЛЬНЫЕ ПРАВИЛА:
- Квашеная капуста = примерно 20 ккал на 100г
- Салат = примерно 15 ккал на 100г
- Овощи = примерно 25 ккал на 100г
- Вода = 0 ккал
- Чай без сахара = 0 ккал
- Кофе без сахара = 0 ккал
- Сок = примерно 50 ккал на 100мл
- Молоко = примерно 50 ккал на 100мл
- Компот = примерно 40 ккал на 100мл
- Морс = примерно 30 ккал на 100мл
- Флэт вайт = примерно 150 ккал на порцию
- Капучино = примерно 120 ккал на порцию
- Латте = примерно 180 ккал на порцию
- Эспрессо = примерно 5 ккал на порцию
- Американо = примерно 10 ккал на порцию
- Макиато = примерно 100 ккал на порцию
- Мокко = примерно 200 ккал на порцию
- Фраппе = примерно 250 ккал на порцию
- Овсянка = примерно 150 ккал на порцию
- Гречка с молоком = примерно 200 ккал на порцию
- Рис с молоком = примерно 180 ккал на порцию
- Манная каша = примерно 120 ккал на порцию
- Пшенная каша = примерно 140 ккал на порцию
- Перловая каша = примерно 130 ккал на порцию
- Ячневая каша = примерно 135 ккал на порцию
- Кукурузная каша = примерно 110 ккал на порцию
- Булгур = примерно 160 ккал на порцию
- Киноа = примерно 170 ккал на порцию
- Йогурт = примерно 80 ккал на порцию
- Кефир = примерно 50 ккал на стакан
- Ряженка = примерно 60 ккал на стакан
- Сметана = примерно 100 ккал на порцию
- Творог = примерно 150 ккал на порцию
- Сыр = примерно 150 ккал на порцию
- Масло = примерно 75 ккал на порцию
- Если продукт не указан явно, но понятен из контекста - анализируй

Примеры:
"Съел тарелку гречки" -> {"success": true, "food_name": "гречка", "amount": 350, "unit": "мл", "calories": 385}
"Выпил стакан молока" -> {"success": true, "food_name": "молоко", "amount": 250, "unit": "мл", "calories": 130}
"Съел маленькую порцию супа" -> {"success": true, "food_name": "суп", "amount": 250, "unit": "мл", "calories": 125}
"Съел большую порцию риса" -> {"success": true, "food_name": "рис", "amount": 500, "unit": "мл", "calories": 550}
"Роллы Филадельфия 4шт" -> {"success": true, "food_name": "роллы Филадельфия", "amount": 4, "unit": "шт", "calories": 280}
"Пицца Маргарита 2 куска" -> {"success": true, "food_name": "пицца Маргарита", "amount": 2, "unit": "кусок", "calories": 500}
"стаканчик мороженного" -> {"success": true, "food_name": "мороженное", "amount": 1, "unit": "стаканчик", "calories": 200}
"порция салата" -> {"success": true, "food_name": "салат", "amount": 1, "unit": "порция", "calories": 150}
"кусок пиццы" -> {"success": true, "food_name": "пицца", "amount": 1, "unit": "кусок", "calories": 250}
"тарелка квашеной капусты" -> {"success": true, "food_name": "квашеная капуста", "amount": 350, "unit": "мл", "calories": 70}
"тарелка салата" -> {"success": true, "food_name": "салат", "amount": 350, "unit": "мл", "calories": 53}
"квашеная капуста" -> {"success": true, "food_name": "квашеная капуста", "amount": 200, "unit": "г", "calories": 40}
"салат" -> {"success": true, "food_name": "салат", "amount": 200, "unit": "г", "calories": 30}
"яблоко" -> {"success": true, "food_name": "яблоко", "amount": 1, "unit": "шт", "calories": 80}
"банан" -> {"success": true, "food_name": "банан", "amount": 1, "unit": "шт", "calories": 100}
"Съел яблоко" -> {"success": true, "food_name": "яблоко", "amount": 1, "unit": "шт", "calories": 80}
"вода" -> {"success": true, "food_name": "вода", "amount": 250, "unit": "мл", "calories": 0}
"сок" -> {"success": true, "food_name": "сок", "amount": 250, "unit": "мл", "calories": 125}
"молоко" -> {"success": true, "food_name": "молоко", "amount": 250, "unit": "мл", "calories": 125}
"компот" -> {"success": true, "food_name": "компот", "amount": 250, "unit": "мл", "calories": 100}
"морс" -> {"success": true, "food_name": "морс", "amount": 250, "unit": "мл", "calories": 75}
"Выпил воду" -> {"success": true, "food_name": "вода", "amount": 250, "unit": "мл", "calories": 0}
"флэт вайт" -> {"success": true, "food_name": "флэт вайт", "amount": 1, "unit": "порция", "calories": 150}
"капучино" -> {"success": true, "food_name": "капучино", "amount": 1, "unit": "порция", "calories": 120}
"латте" -> {"success": true, "food_name": "латте", "amount": 1, "unit": "порция", "calories": 180}
"эспрессо" -> {"success": true, "food_name": "эспрессо", "amount": 1, "unit": "порция", "calories": 5}
"американо" -> {"success": true, "food_name": "американо", "amount": 1, "unit": "порция", "calories": 10}
"макиато" -> {"success": true, "food_name": "макиато", "amount": 1, "unit": "порция", "calories": 100}
"мокко" -> {"success": true, "food_name": "мокко", "amount": 1, "unit": "порция", "calories": 200}
"фраппе" -> {"success": true, "food_name": "фраппе", "amount": 1, "unit": "порция", "calories": 250}
"Выпил капучино" -> {"success": true, "food_name": "капучино", "amount": 1, "unit": "порция", "calories": 120}
"овсянка" -> {"success": true, "food_name": "овсянка", "amount": 1, "unit": "порция", "calories": 150}
"гречка с молоком" -> {"success": true, "food_name": "гречка с молоком", "amount": 1, "unit": "порция", "calories": 200}
"рис с молоком" -> {"success": true, "food_name": "рис с молоком", "amount": 1, "unit": "порция", "calories": 180}
"манная каша" -> {"success": true, "food_name": "манная каша", "amount": 1, "unit": "порция", "calories": 120}
"пшенная каша" -> {"success": true, "food_name": "пшенная каша", "amount": 1, "unit": "порция", "calories": 140}
"перловая каша" -> {"success": true, "food_name": "перловая каша", "amount": 1, "unit": "порция", "calories": 130}
"ячневая каша" -> {"success": true, "food_name": "ячневая каша", "amount": 1, "unit": "порция", "calories": 135}
"кукурузная каша" -> {"success": true, "food_name": "кукурузная каша", "amount": 1, "unit": "порция", "calories": 110}
"булгур" -> {"success": true, "food_name": "булгур", "amount": 1, "unit": "порция", "calories": 160}
"киноа" -> {"success": true, "food_name": "киноа", "amount": 1, "unit": "порция", "calories": 170}
"Съел овсянку" -> {"success": true, "food_name": "овсянка", "amount": 1, "unit": "порция", "calories": 150}
"Съел гречку с молоком" -> {"success": true, "food_name": "гречка с молоком", "amount": 1, "unit": "порция", "calories": 200}
"овсянка 200 калорий" -> {"success": true, "food_name": "овсянка", "amount": 1, "unit": "порция", "calories": 200}
"гречка 300 ккал" -> {"success": true, "food_name": "гречка", "amount": 1, "unit": "порция", "calories": 300}
"яблоко 50 калорий" -> {"success": true, "food_name": "яблоко", "amount": 1, "unit": "шт", "calories": 50}
"банан 80 ккал" -> {"success": true, "food_name": "банан", "amount": 1, "unit": "шт", "calories": 80}
"капучино 150 калорий" -> {"success": true, "food_name": "капучино", "amount": 1, "unit": "порция", "calories": 150}
"йогурт" -> {"success": true, "food_name": "йогурт", "amount": 1, "unit": "порция", "calories": 80}
"кефир" -> {"success": true, "food_name": "кефир", "amount": 1, "unit": "стакан", "calories": 50}
"ряженка" -> {"success": true, "food_name": "ряженка", "amount": 1, "unit": "стакан", "calories": 60}
"сметана" -> {"success": true, "food_name": "сметана", "amount": 1, "unit": "порция", "calories": 100}
"творог" -> {"success": true, "food_name": "творог", "amount": 1, "unit": "порция", "calories": 150}
"сыр" -> {"success": true, "food_name": "сыр", "amount": 1, "unit": "порция", "calories": 150}
"масло" -> {"success": true, "food_name": "масло", "amount": 1, "unit": "порция", "calories": 75}
"Съел йогурт" -> {"success": true, "food_name": "йогурт", "amount": 1, "unit": "порция", "calories": 80}
"Выпил кефир" -> {"success": true, "food_name": "кефир", "amount": 1, "unit": "стакан", "calories": 50}
"йогурт экспонента" -> {"success": true, "food_name": "йогурт экспонента", "amount": 1, "unit": "порция", "calories": 80}
"""
            
            # Пользовательский промпт
            user_prompt = f"Проанализируй это сообщение о еде: {text}"
            
            # Отправляем запрос к GPT
            response = self.client.chat.completions.create(
                model=self.config['model'],
                messages=[
                    {"role": "system", "content": system_prompt},
                    {"role": "user", "content": user_prompt}
                ],
                max_tokens=self.config['max_tokens'],
                temperature=self.config['temperature']
            )
            
            # Извлекаем ответ
            response_text = response.choices[0].message.content.strip()
            logger.info(f"GPT ответ: {response_text}")
            
            # Парсим JSON ответ
            try:
                result = json.loads(response_text)
                
                # Проверяем обязательные поля
                if not isinstance(result, dict):
                    raise ValueError("Ответ не является объектом")
                
                if "success" not in result:
                    raise ValueError("Отсутствует поле 'success'")
                
                if result.get("success") and not all(key in result for key in ["food_name", "amount", "unit", "calories"]):
                    raise ValueError("Отсутствуют обязательные поля для успешного ответа")
                
                return result
                
            except json.JSONDecodeError as e:
                logger.error(f"Ошибка парсинга JSON ответа: {e}")
                logger.error(f"Ответ ИИ: {response_text}")
                return {
                    "success": False,
                    "message": "Не удалось проанализировать информацию о еде. Попробуйте еще раз."
                }
            except ValueError as e:
                logger.error(f"Ошибка валидации ответа: {e}")
                logger.error(f"Ответ ИИ: {response_text}")
                
                # Попытка исправить JSON если возможно
                try:
                    # Ищем JSON в тексте
                    import re
                    json_match = re.search(r'\{.*\}', response_text, re.DOTALL)
                    if json_match:
                        fixed_json = json_match.group()
                        result = json.loads(fixed_json)
                        if isinstance(result, dict) and "success" in result:
                            logger.info("JSON исправлен успешно")
                            return result
                except:
                    pass
                
                return {
                    "success": False,
                    "message": "Не удалось проанализировать информацию о еде. Попробуйте еще раз."
                }
            
        except Exception as e:
            logger.error(f"Ошибка при анализе еды: {e}")
            return {
                "success": False,
                "message": "Ошибка при обработке запроса"
            }
    
    def get_food_suggestions(self, partial_text: str) -> List[str]:
        """Получение предложений продуктов по частичному тексту"""
        try:
            system_prompt = """
Ты - помощник по питанию. Предложи 5 популярных продуктов, которые могут подходить под описание пользователя.
Отвечай ТОЛЬКО списком продуктов через запятую, без дополнительного текста.
"""
            
            user_prompt = f"Предложи продукты для: {partial_text}"
            
            response = self.client.chat.completions.create(
                model=self.config['model'],
                messages=[
                    {"role": "system", "content": system_prompt},
                    {"role": "user", "content": user_prompt}
                ],
                max_tokens=200,
                temperature=0.7
            )
            
            suggestions_text = response.choices[0].message.content.strip()
            suggestions = [s.strip() for s in suggestions_text.split(',')]
            
            return suggestions[:5]
            
        except Exception as e:
            logger.error(f"Ошибка при получении предложений: {e}")
            return []
    
    def calculate_calories(self, food_name: str, amount: float, unit: str) -> float:
        """Расчет калорий для продукта"""
        try:
            system_prompt = """
Ты - эксперт по калорийности продуктов. Рассчитай калории для указанного продукта.
Отвечай ТОЛЬКО числом (калории на 100г/100мл), без дополнительного текста.
"""
            
            user_prompt = f"Сколько калорий в 100{unit} {food_name}?"
            
            response = self.client.chat.completions.create(
                model=self.config['model'],
                messages=[
                    {"role": "system", "content": system_prompt},
                    {"role": "user", "content": user_prompt}
                ],
                max_tokens=50,
                temperature=0.1
            )
            
            calories_text = response.choices[0].message.content.strip()
            
            try:
                calories_per_100 = float(calories_text)
                # Рассчитываем калории для указанного количества
                total_calories = (calories_per_100 * amount) / 100
                return round(total_calories, 1)
            except ValueError:
                logger.error(f"Не удалось распарсить калории: {calories_text}")
                return 0.0
            
        except Exception as e:
            logger.error(f"Ошибка при расчете калорий: {e}")
            return 0.0
    
    def get_nutrition_advice(self, food_name: str) -> str:
        """Получение совета по питанию для продукта"""
        try:
            system_prompt = """
Ты - диетолог. Дай краткий совет по питанию для указанного продукта.
Отвечай кратко (1-2 предложения) на русском языке.
"""
            
            user_prompt = f"Дай совет по питанию для {food_name}"
            
            response = self.client.chat.completions.create(
                model=self.config['model'],
                messages=[
                    {"role": "system", "content": system_prompt},
                    {"role": "user", "content": user_prompt}
                ],
                max_tokens=150,
                temperature=0.7
            )
            
            advice = response.choices[0].message.content.strip()
            return advice
            
        except Exception as e:
            logger.error(f"Ошибка при получении совета: {e}")
            return "Информация недоступна"
    
    def validate_food_input(self, text: str) -> Dict[str, Any]:
        """Валидация ввода пользователя"""
        try:
            system_prompt = """
Ты - валидатор сообщений о еде. Проверь, содержит ли сообщение достаточно информации.
Отвечай ТОЛЬКО в формате JSON:
{
    "valid": true/false,
    "missing_info": ["что не хватает"],
    "suggestions": ["предложения по улучшению"]
}
"""
            
            user_prompt = f"Проверь сообщение: {text}"
            
            response = self.client.chat.completions.create(
                model=self.config['model'],
                messages=[
                    {"role": "system", "content": system_prompt},
                    {"role": "user", "content": user_prompt}
                ],
                max_tokens=200,
                temperature=0.3
            )
            
            response_text = response.choices[0].message.content.strip()
            
            try:
                result = json.loads(response_text)
                return result
            except json.JSONDecodeError:
                return {
                    "valid": False,
                    "missing_info": ["Не удалось проанализировать"],
                    "suggestions": ["Попробуйте быть более конкретным"]
                }
            
        except Exception as e:
            logger.error(f"Ошибка при валидации: {e}")
            return {
                "valid": False,
                "missing_info": ["Ошибка обработки"],
                "suggestions": ["Попробуйте позже"]
            }
    
    
    def smart_calories_edit(self, user_text: str, current_record: dict) -> float:
        """Умное редактирование калорий с помощью ИИ"""
        try:
            system_prompt = """
Ты - помощник по редактированию записей о еде. Твоя задача - понять, как пользователь хочет изменить калории записи.

ПРАВИЛА:
1. Если пользователь вводит число - используй его
2. Если пользователь говорит "увеличить", "больше", "добавить" - увеличь калории на 20-50%
3. Если пользователь говорит "уменьшить", "меньше", "сделать меньше" - уменьши калории на 20-50%
4. Если пользователь говорит "в два раза больше" - удвой калории
5. Если пользователь говорит "в два раза меньше" - раздели калории на 2
6. Если пользователь говорит "сделать 200 калорий" - используй 200
7. Всегда возвращай ТОЛЬКО число калорий, без дополнительного текста

ПРИМЕРЫ:
"увеличить" -> увеличить на 30%
"уменьшить" -> уменьшить на 30%
"сделать 250 калорий" -> 250
"в два раза больше" -> удвоить
"немного меньше" -> уменьшить на 20%
"""
            
            user_prompt = f"""
Текущая запись: {current_record['food_name']} - {current_record['amount']} {current_record['unit']} ({current_record['calories']} ккал)

Пользователь хочет: {user_text}

Верни новое количество калорий (только число):
"""
            
            response = self.client.chat.completions.create(
                model=self.config['model'],
                messages=[
                    {"role": "system", "content": system_prompt},
                    {"role": "user", "content": user_prompt}
                ],
                max_tokens=50,
                temperature=0.1
            )
            
            result = response.choices[0].message.content.strip()
            
            # Пытаемся извлечь число из ответа
            import re
            numbers = re.findall(r'\d+(?:\.\d+)?', result)
            if numbers:
                new_calories = float(numbers[0])
                # Ограничиваем разумными пределами
                if new_calories < 0:
                    new_calories = 0
                if new_calories > 10000:
                    new_calories = 10000
                return new_calories
            else:
                return None
                
        except Exception as e:
            logger.error(f"Ошибка при умном редактировании калорий: {e}")
            return None

    def smart_record_edit(self, user_text: str, current_record: dict) -> dict:
        """Умное редактирование записи с помощью ИИ (количество, единицы, калории)"""
        try:
            system_prompt = """
Ты - помощник по редактированию записей о еде. Твоя задача - понять, как пользователь хочет изменить запись.

ПРАВИЛА:
1. Если пользователь вводит число - это может быть новое количество или калории
2. Если пользователь говорит "увеличить порцию", "больше", "добавить" - увеличь количество на 20-50%
3. Если пользователь говорит "уменьшить порцию", "меньше", "сделать меньше" - уменьши количество на 20-50%
4. Если пользователь говорит "в два раза больше" - удвой количество
5. Если пользователь говорит "в два раза меньше" - раздели количество на 2
6. Если пользователь говорит "сделать 200 грамм" - измени количество на 200г
7. Если пользователь говорит "сделать 2 порции" - измени количество на 2 порции
8. Если пользователь говорит "сделать 300 калорий" - измени калории на 300
9. Если пользователь говорит "стакан", "чашка", "тарелка" - измени единицу измерения
10. Всегда возвращай JSON с полями: amount, unit, calories

ОСОБЫЕ ПРАВИЛА ДЛЯ КОМПЛЕКСНЫХ БЛЮД:
- Если запись содержит "и" (например, "хинкали и хачапури"), и пользователь указывает конкретный компонент (например, "2 шт хинкали"), то:
  * Измени количество на указанное пользователем
  * Пересчитай калории пропорционально для всего блюда
  * Например: "2 шт хинкали" для "хинкали и хачапури" = amount: 2, unit: "шт"

ПРИМЕРЫ:
"увеличить порцию" -> увеличить количество на 30%
"уменьшить порцию" -> уменьшить количество на 30%
"сделать 200 грамм" -> amount: 200, unit: "г"
"сделать 2 стакана" -> amount: 2, unit: "стакан"
"сделать 300 калорий" -> calories: 300
"в два раза больше" -> удвоить количество
"немного меньше" -> уменьшить количество на 20%
"2 шт хинкали" для "хинкали и хачапури" -> amount: 2, unit: "шт"
"3 шт хачапури" для "хачапури и хинкали" -> amount: 3, unit: "шт"
"""
            
            user_prompt = f"""
Текущая запись: {current_record['food_name']} - {current_record['amount']} {current_record['unit']} ({current_record['calories']} ккал)

Пользователь хочет: {user_text}

Верни JSON с изменениями (только поля, которые нужно изменить):
"""
            
            response = self.client.chat.completions.create(
                model=self.config['model'],
                messages=[
                    {"role": "system", "content": system_prompt},
                    {"role": "user", "content": user_prompt}
                ],
                max_tokens=100,
                temperature=0.1
            )
            
            result = response.choices[0].message.content.strip()
            
            # Пытаемся распарсить JSON
            import json
            import re
            
            # Ищем JSON в ответе
            json_match = re.search(r'\{.*\}', result, re.DOTALL)
            if json_match:
                json_str = json_match.group(0)
                # Исправляем возможные ошибки в JSON
                json_str = json_str.replace(',}', '}').replace(',]', ']')
                try:
                    changes = json.loads(json_str)
                    return changes
                except json.JSONDecodeError:
                    # Fallback - пытаемся извлечь числа из текста
                    numbers = re.findall(r'\d+(?:\.\d+)?', result)
                    if numbers:
                        return {'amount': float(numbers[0])}
                    return None
            else:
                return None
                
        except Exception as e:
            logger.error(f"Ошибка при умном редактировании записи: {e}")
            return None

    def close(self):
        """Закрытие HTTP клиента"""
        if self.http_client:
            self.http_client.close()
            logger.info("HTTP клиент закрыт")
