#!/usr/bin/env python3
"""
Скрипт для тестирования API FatSecret с использованием OAuth 1.0
"""

import os
import time
import hmac
import base64
import random
import hashlib
import urllib.parse
import requests
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"✅ Loaded .env from: {env_path}")

# Получаем API ключи из переменных окружения
FATSECRET_KEY = os.environ.get("FATSECRET_CUSTOMER_KEY") or os.environ.get("FATSECRET_CLIENT_ID")
FATSECRET_SECRET = os.environ.get("FATSECRET_CLIENT_SECRET")

if not FATSECRET_KEY or not FATSECRET_SECRET:
    raise ValueError("FatSecret API keys not found in .env file")

print(f"🔑 Using FatSecret API keys: KEY={FATSECRET_KEY[:8]}...")
print(f"🔑 Using FatSecret SECRET (first few chars): {FATSECRET_SECRET[:5]}...")


def generate_oauth_params(http_method, url, params):
    """Создание и подписание OAuth 1.0 параметров"""
    # Текущее время в секундах
    timestamp = str(int(time.time()))
    # Случайная строка для nonce
    nonce = ''.join([str(random.randint(0, 9)) for _ in range(8)])
    
    # Базовый набор параметров OAuth
    oauth_params = {
        'oauth_consumer_key': FATSECRET_KEY,
        'oauth_nonce': nonce,
        'oauth_signature_method': 'HMAC-SHA1',
        'oauth_timestamp': timestamp,
        'oauth_version': '1.0'
    }
    
    # Объединяем с параметрами запроса
    all_params = {**params, **oauth_params}
    
    # Сортируем параметры по ключу
    sorted_params = sorted(all_params.items())
    
    # Создаем строку параметров для подписи
    param_string = "&".join([f"{urllib.parse.quote(str(k))}={urllib.parse.quote(str(v))}" 
                            for k, v in sorted_params])
    
    # Создаем строку для подписи
    signature_base = f"{http_method}&{urllib.parse.quote(url, safe='')}&{urllib.parse.quote(param_string, safe='')}"
    
    # Создаем ключ для подписи
    signing_key = f"{urllib.parse.quote(str(FATSECRET_SECRET), safe='')}&"
    
    # Создаем HMAC-SHA1 подпись
    signature = base64.b64encode(
        hmac.new(
            signing_key.encode(), 
            signature_base.encode(), 
            hashlib.sha1
        ).digest()
    ).decode()
    
    # Добавляем подпись к параметрам OAuth
    all_params['oauth_signature'] = signature
    
    return all_params


def search_food(query, max_results=5, locale=None):
    """Поиск продуктов по названию с использованием OAuth 1.0"""
    print(f"\n🔍 Searching for '{query}'{' with locale ' + locale if locale else ''}...")
    
    # URL для API
    url = "https://platform.fatsecret.com/rest/server.api"
    
    # Параметры запроса
    params = {
        'method': 'foods.search',
        'search_expression': query,
        'max_results': max_results,
        'format': 'json'
    }
    
    # Добавляем локаль если указана
    if locale:
        params['language'] = locale
    
    # Получаем подписанные OAuth параметры
    oauth_params = generate_oauth_params("GET", url, params)
    
    try:
        # Отправляем запрос
        response = requests.get(url, params=oauth_params)
        
        print(f"📥 Response status code: {response.status_code}")
        
        if response.status_code == 200:
            print("✅ Search successful!")
            result = response.json()
            return result
        else:
            print(f"❌ Error during search: {response.status_code}")
            print(response.text)
            return None
    except Exception as e:
        print(f"❌ Exception during search: {e}")
        return None


def process_search_results(result):
    """Обработка и вывод результатов поиска"""
    if not result or "foods" not in result:
        print("❌ No valid results found")
        return
    
    foods_data = result["foods"]
    
    if "food" not in foods_data:
        print("⚠️ No food items found")
        return
    
    food_list = foods_data["food"]
    if not isinstance(food_list, list):
        food_list = [food_list]  # Если только один результат, оборачиваем в список
    
    print(f"📊 Found {len(food_list)} results")
    
    # Выводим первые 3 результата
    for i, food in enumerate(food_list[:3]):
        food_name = food.get("food_name", "Unknown")
        food_id = food.get("food_id", "Unknown")
        food_desc = food.get("food_description", "No description")
        
        print(f"  {i+1}. [{food_id}] {food_name}")
        print(f"     {food_desc}")


def main():
    """Основная функция для тестирования API FatSecret"""
    print("\n🚀 Starting FatSecret API test with OAuth 1.0...\n")
    
    # Тестируем поиск продуктов на английском
    search_queries = ["PowerAde", "Americano", "Coca-Cola", "chicken breast"]
    
    for query in search_queries:
        result = search_food(query)
        if result:
            process_search_results(result)
    
    # Тестируем поиск продуктов на русском
    russian_queries = ["Барни", "хлеб", "яблоко"]
    
    for query in russian_queries:
        result = search_food(query, locale="ru_RU")
        if result:
            process_search_results(result)
    
    print("\n✅ Test completed!")


if __name__ == "__main__":
    main()