#!/usr/bin/env python3
"""
Скрипт для тестирования API сервиса питания (Nutrition Service)
"""

import os
import sys
import json
import requests
from datetime import datetime
from dotenv import load_dotenv

# Загружаем .env файл
current_dir = os.path.dirname(os.path.abspath(__file__))
env_path = os.path.join(current_dir, ".env")
load_dotenv(env_path)
print(f"✅ Загружен .env из: {env_path}")

# Базовый URL API
BASE_URL = os.environ.get("NUTRITION_API_URL", "http://localhost:8006/api/v1/nutrition")
AUTH_URL = os.environ.get("AUTH_API_URL", "http://localhost:8001/api/v1/auth")

# Настройки для тестовых данных
TEST_USER = {
    "username": "test_nutrition_user",
    "password": "Test123!",
    "email": "test_nutrition@example.com",
    "first_name": "Test",
    "last_name": "Nutrition",
    "phone": "+79991234999"
}

def get_auth_token():
    """Получение токена авторизации"""
    print("\n🔑 Получаем токен авторизации...")
    
    # Пытаемся сначала войти
    try:
        login_data = {
            "username": TEST_USER["username"],
            "password": TEST_USER["password"]
        }
        
        login_response = requests.post(
            f"{AUTH_URL}/login", 
            json=login_data
        )
        
        if login_response.status_code == 200:
            token = login_response.json().get("access_token")
            print("✅ Успешный вход в систему!")
            return token
    except Exception as e:
        print(f"⚠️ Ошибка при попытке входа: {e}")
    
    # Если вход не удался, пробуем регистрацию
    try:
        register_response = requests.post(
            f"{AUTH_URL}/register", 
            json=TEST_USER
        )
        
        if register_response.status_code == 201:
            print("✅ Пользователь успешно зарегистрирован!")
            
            # Теперь входим с новыми учетными данными
            login_data = {
                "username": TEST_USER["username"],
                "password": TEST_USER["password"]
            }
            
            login_response = requests.post(
                f"{AUTH_URL}/login", 
                json=login_data
            )
            
            if login_response.status_code == 200:
                token = login_response.json().get("access_token")
                print("✅ Успешный вход в систему!")
                return token
    except Exception as e:
        print(f"❌ Ошибка при регистрации: {e}")
    
    print("❌ Не удалось получить токен авторизации")
    return None

def search_food(token, query="apple", max_results=5):
    """Поиск продуктов питания"""
    print(f"\n🔍 Поиск продуктов по запросу '{query}'...")
    
    headers = {"Authorization": f"Bearer {token}"}
    data = {
        "query": query,
        "max_results": max_results
    }
    
    try:
        response = requests.post(
            f"{BASE_URL}/search", 
            json=data, 
            headers=headers
        )
        
        print(f"📥 Код ответа: {response.status_code}")
        
        if response.status_code == 200:
            results = response.json()
            print(f"✅ Найдено продуктов: {len(results)}")
            
            # Выводим первые 3 результата
            for i, food in enumerate(results[:3]):
                print(f"  {i+1}. [{food.get('id')}] {food.get('name')}")
                print(f"     {food.get('description')}")
                print(f"     Калории: {food.get('calories')} ккал/100г")
            
            return results
        else:
            print(f"❌ Ошибка при поиске: {response.status_code}")
            print(response.text)
            return None
    except Exception as e:
        print(f"❌ Исключение при поиске: {e}")
        return None

def add_diary_entry(token, food_id=1):
    """Добавление записи в дневник питания"""
    print(f"\n📝 Добавление записи в дневник питания (продукт ID: {food_id})...")
    
    headers = {"Authorization": f"Bearer {token}"}
    today = datetime.now().strftime("%Y-%m-%d")
    
    data = {
        "food_item_id": food_id,
        "entry_date": today,
        "meal_type": "breakfast",
        "quantity": 1.0,
        "unit": "piece",
        "notes": "Тестовая запись"
    }
    
    try:
        response = requests.post(
            f"{BASE_URL}/diary", 
            json=data, 
            headers=headers
        )
        
        print(f"📥 Код ответа: {response.status_code}")
        
        if response.status_code in [200, 201]:
            result = response.json()
            print("✅ Запись успешно добавлена в дневник питания!")
            print(f"   ID записи: {result.get('id')}")
            print(f"   Калории: {result.get('calories')} ккал")
            return result
        else:
            print(f"❌ Ошибка при добавлении записи: {response.status_code}")
            print(response.text)
            return None
    except Exception as e:
        print(f"❌ Исключение при добавлении записи: {e}")
        return None

def get_diary_entries(token):
    """Получение записей дневника за текущий день"""
    print("\n📋 Получение записей дневника питания...")
    
    headers = {"Authorization": f"Bearer {token}"}
    today = datetime.now().strftime("%Y-%m-%d")
    
    try:
        response = requests.get(
            f"{BASE_URL}/diary?date={today}", 
            headers=headers
        )
        
        print(f"📥 Код ответа: {response.status_code}")
        
        if response.status_code == 200:
            results = response.json()
            print(f"✅ Получено записей: {len(results)}")
            
            # Выводим записи
            for i, entry in enumerate(results):
                print(f"  {i+1}. Прием пищи: {entry.get('meal_type')}")
                print(f"     Продукт ID: {entry.get('food_item_id')}")
                print(f"     Калории: {entry.get('calories')} ккал")
            
            return results
        else:
            print(f"❌ Ошибка при получении записей: {response.status_code}")
            print(response.text)
            return None
    except Exception as e:
        print(f"❌ Исключение при получении записей: {e}")
        return None

def add_water_entry(token, amount_ml=250):
    """Добавление записи о потреблении воды"""
    print(f"\n💧 Добавление записи о потреблении воды ({amount_ml} мл)...")
    
    headers = {"Authorization": f"Bearer {token}"}
    today = datetime.now().strftime("%Y-%m-%d")
    
    data = {
        "amount_ml": amount_ml,
        "entry_date": today,
        "notes": "Тестовая запись"
    }
    
    try:
        response = requests.post(
            f"{BASE_URL}/water", 
            json=data, 
            headers=headers
        )
        
        print(f"📥 Код ответа: {response.status_code}")
        
        if response.status_code in [200, 201]:
            result = response.json()
            print("✅ Запись о потреблении воды успешно добавлена!")
            print(f"   ID записи: {result.get('id')}")
            print(f"   Объем: {result.get('amount_ml')} мл")
            return result
        else:
            print(f"❌ Ошибка при добавлении записи о воде: {response.status_code}")
            print(response.text)
            return None
    except Exception as e:
        print(f"❌ Исключение при добавлении записи о воде: {e}")
        return None

def add_activity_entry(token):
    """Добавление записи о физической активности"""
    print("\n🏃‍♀️ Добавление записи о физической активности...")
    
    headers = {"Authorization": f"Bearer {token}"}
    today = datetime.now().strftime("%Y-%m-%d")
    
    data = {
        "entry_date": today,
        "activity_type": "walking",
        "duration_minutes": 30,
        "distance_km": 2.5,
        "intensity": "medium",
        "notes": "Тестовая активность"
    }
    
    try:
        response = requests.post(
            f"{BASE_URL}/activity", 
            json=data, 
            headers=headers
        )
        
        print(f"📥 Код ответа: {response.status_code}")
        
        if response.status_code in [200, 201]:
            result = response.json()
            print("✅ Запись о физической активности успешно добавлена!")
            print(f"   ID записи: {result.get('id')}")
            print(f"   Тип: {result.get('activity_type')}")
            print(f"   Продолжительность: {result.get('duration_minutes')} мин")
            print(f"   Потрачено калорий: {result.get('calories_burned')} ккал")
            return result
        else:
            print(f"❌ Ошибка при добавлении записи об активности: {response.status_code}")
            print(response.text)
            return None
    except Exception as e:
        print(f"❌ Исключение при добавлении записи об активности: {e}")
        return None

def get_daily_summary(token):
    """Получение дневной сводки"""
    print("\n📊 Получение сводки за день...")
    
    headers = {"Authorization": f"Bearer {token}"}
    today = datetime.now().strftime("%Y-%m-%d")
    
    try:
        response = requests.get(
            f"{BASE_URL}/summary?date={today}", 
            headers=headers
        )
        
        print(f"📥 Код ответа: {response.status_code}")
        
        if response.status_code == 200:
            result = response.json()
            print("✅ Сводка за день успешно получена!")
            print(f"   Всего калорий: {result.get('total_calories')} ккал")
            print(f"   Всего белка: {result.get('total_protein')} г")
            print(f"   Всего жиров: {result.get('total_fat')} г")
            print(f"   Всего углеводов: {result.get('total_carbs')} г")
            print(f"   Потреблено воды: {result.get('water_consumed_ml')} мл")
            print(f"   Активность: {result.get('activity_minutes')} мин")
            print(f"   Сожжено калорий: {result.get('calories_burned')} ккал")
            return result
        else:
            print(f"❌ Ошибка при получении сводки: {response.status_code}")
            print(response.text)
            return None
    except Exception as e:
        print(f"❌ Исключение при получении сводки: {e}")
        return None

def main():
    """Основная функция для тестирования API сервиса питания"""
    print("\n🚀 Запуск тестирования API сервиса питания...\n")
    
    # Получаем токен авторизации
    token = get_auth_token()
    if not token:
        print("❌ Невозможно продолжить тестирование без авторизации")
        sys.exit(1)
    
    # Выполняем поиск продуктов
    search_results = search_food(token, "apple")
    
    if search_results and len(search_results) > 0:
        # Используем первый найденный продукт для дальнейшего тестирования
        food_id = search_results[0].get("id")
        
        # Добавляем запись в дневник питания
        add_diary_entry(token, food_id)
        
        # Получаем записи дневника
        get_diary_entries(token)
    else:
        # Если поиск не дал результатов, продолжаем тестирование с предполагаемым ID продукта
        print("⚠️ Используем предполагаемый ID продукта для дальнейших тестов")
        add_diary_entry(token, 1)
    
    # Добавляем записи о воде и активности
    add_water_entry(token)
    add_activity_entry(token)
    
    # Получаем дневную сводку
    get_daily_summary(token)
    
    print("\n✅ Тестирование API сервиса питания завершено!")


if __name__ == "__main__":
    main()