#!/usr/bin/env python3
"""
Скрипт для проверки обоих API ключей (sandbox и production)
"""

import os
import sys
import json
import requests

def test_api_key(api_key, is_sandbox=True):
    """Проверка API ключа"""
    
    if is_sandbox:
        base_url = "https://fr24api.flightradar24.com/api"
        headers = {
            "Authorization": f"Bearer {api_key}",
            "Accept": "application/json",
            "Accept-Version": "v1"
        }
        key_type = "sandbox"
    else:
        base_url = "https://api.flightradar24.com/common/v1"
        headers = {
            "Authorization": f"Bearer {api_key}",
            "Content-Type": "application/json"
        }
        key_type = "production"
    
    print(f"\n🔑 Тестирование {key_type} ключа...")
    print(f"   Ключ: {api_key[:15]}...{api_key[-10:] if len(api_key) > 25 else '***'}")
    print(f"   Base URL: {base_url}")
    
    results = []
    
    # Тестовые endpoints в зависимости от типа
    if is_sandbox:
        test_endpoints = [
            ("/static/airlines/AAL/light", "Авиакомпания American Airlines (light)"),
            ("/live/flight-positions/light?bounds=50.682,46.218,14.422,22.243", "Live позиции (test bounds)"),
        ]
    else:
        test_endpoints = [
            ("/airport/light/SVO", "Аэропорт Шереметьево (light)"),
            ("/usage", "Отчет об использовании API"),
        ]
    
    for endpoint, description in test_endpoints:
        try:
            url = base_url + endpoint if not endpoint.startswith("http") else endpoint
            print(f"\n🔍 Тест: {description}")
            print(f"   Endpoint: {endpoint.split('?')[0]}")
            
            # Обработка параметров в URL
            if "?" in endpoint:
                url, query_string = url.split("?", 1)
                from urllib.parse import parse_qs
                params = parse_qs(query_string)
                # Преобразуем списки в одиночные значения
                params = {k: v[0] if len(v) == 1 else v for k, v in params.items()}
                response = requests.get(url, headers=headers, params=params, timeout=10)
            else:
                response = requests.get(url, headers=headers, timeout=10)
            
            print(f"   Статус: {response.status_code}")
            
            if response.status_code == 200:
                try:
                    data = response.json()
                    print(f"   ✅ Успешно")
                    
                    # Вывод фрагмента данных
                    if "data" in data:
                        data_count = len(data.get("data", []))
                        print(f"   📊 Данных: {data_count} записей")
                        if data_count > 0:
                            first_item = data["data"][0]
                            print(f"   🎯 Пример: {json.dumps(first_item, ensure_ascii=False)[:100]}...")
                    elif "name" in data:
                        print(f"   📝 {data.get('name', 'N/A')} ({data.get('iata', 'N/A')}/{data.get('icao', 'N/A')})")
                    
                    results.append((endpoint, True, response.status_code, None))
                    
                except json.JSONDecodeError:
                    print(f"   ⚠️  Ответ не JSON: {response.text[:100]}")
                    results.append((endpoint, False, response.status_code, "Not JSON"))
            
            elif response.status_code == 400:
                print(f"   ❌ Ошибка 400: Неверный запрос")
                print(f"   Детали: {response.text[:200]}")
                results.append((endpoint, False, response.status_code, "Bad request"))
            
            elif response.status_code == 401:
                print(f"   ❌ Ошибка 401: Неавторизован")
                results.append((endpoint, False, response.status_code, "Unauthorized"))
            
            elif response.status_code == 403:
                print(f"   ❌ Ошибка 403: Доступ запрещен")
                print(f"   Возможно: неверный ключ, нет прав, закончились кредиты")
                results.append((endpoint, False, response.status_code, "Forbidden"))
            
            elif response.status_code == 404:
                print(f"   ⚠️  Ошибка 404: Endpoint не найден")
                results.append((endpoint, False, response.status_code, "Not found"))
            
            elif response.status_code == 429:
                print(f"   ⚠️  Ошибка 429: Слишком много запросов")
                results.append((endpoint, False, response.status_code, "Rate limited"))
            
            else:
                print(f"   ❌ Ошибка {response.status_code}")
                print(f"   Ответ: {response.text[:200]}")
                results.append((endpoint, False, response.status_code, response.text[:100]))
                
        except requests.exceptions.Timeout:
            print(f"   ⏱️  Таймаут соединения")
            results.append((endpoint, False, "Timeout", "Connection timeout"))
        except requests.exceptions.ConnectionError:
            print(f"   🔌 Ошибка соединения")
            results.append((endpoint, False, "ConnectionError", "Network error"))
        except Exception as e:
            print(f"   💥 Неожиданная ошибка: {e}")
            results.append((endpoint, False, "Exception", str(e)))
    
    # Сводка
    successful = sum(1 for _, success, _, _ in results if success)
    total = len(results)
    
    print(f"\n📊 Сводка {key_type}: {successful}/{total} успешных тестов")
    
    if successful > 0:
        print(f"🎉 {key_type.capitalize()} ключ работает!")
        return True, key_type
    else:
        print(f"❌ {key_type.capitalize()} ключ не работает")
        return False, key_type

def main():
    print("=== Проверка API ключей Flightradar24 ===")
    print("Тестирование sandbox и production ключей")
    print("=" * 50)
    
    # Ключи из сообщений
    sandbox_key = "9d4d192b-8641-4420-b00e-09e3d935badf|fIMdnj8WixjDqyaUTHLKPlgHU9d5JiOZwJJWGiVHdcda602e"
    production_key = "019d0c18-2d07-704c-9b3e-af32f2482f79|lDODG5lI4BuOGDaE24TPLqRANiuSLXudbC8VrbCgf351f19f"
    
    # Тестируем sandbox
    sandbox_ok, _ = test_api_key(sandbox_key, is_sandbox=True)
    
    # Тестируем production
    production_ok, _ = test_api_key(production_key, is_sandbox=False)
    
    print("\n" + "=" * 50)
    print("🎯 Итоговые результаты:")
    print(f"   Sandbox:   {'✅ Работает' if sandbox_ok else '❌ Не работает'}")
    print(f"   Production: {'✅ Работает' if production_ok else '❌ Не работает'}")
    
    if sandbox_ok and production_ok:
        print("\n🎉 Оба ключа работают! Можно начинать разработку.")
        print("   Этап 1: Прототип на sandbox данных")
        print("   Этап 2: Переход на production данные после отмашки")
    elif sandbox_ok and not production_ok:
        print("\n⚠️  Sandbox работает, production нет.")
        print("   Можно разрабатывать прототип на sandbox, но нужно проверить production ключ.")
        print("   Возможные причины: неактивированная подписка, закончились кредиты.")
    elif not sandbox_ok and production_ok:
        print("\n⚠️  Production работает, sandbox нет.")
        print("   Можно разрабатывать сразу на production (будет расходовать кредиты).")
    else:
        print("\n❌ Ни один ключ не работает.")
        print("   Проверьте правильность ключей и статус подписки.")
    
    # Сохраняем ключи в файл .env для удобства
    with open(".env", "w") as f:
        f.write(f"FLIGHTRADAR24_SANDBOX_KEY={sandbox_key}\n")
        f.write(f"FLIGHTRADAR24_PRODUCTION_KEY={production_key}\n")
        f.write(f"FLIGHTRADAR24_API_KEY={sandbox_key}  # По умолчанию используем sandbox\n")
    
    print(f"\n💾 Ключи сохранены в .env файл")
    print("   Для использования в скриптах:")
    print("   - Sandbox: FLIGHTRADAR24_SANDBOX_KEY")
    print("   - Production: FLIGHTRADAR24_PRODUCTION_KEY")
    print("   - По умолчанию: FLIGHTRADAR24_API_KEY (sandbox)")
    
    return 0 if sandbox_ok else 1

if __name__ == "__main__":
    try:
        sys.exit(main())
    except KeyboardInterrupt:
        print("\n\n⏹ Проверка прервана")
        sys.exit(1)
    except Exception as e:
        print(f"\n💥 Критическая ошибка: {e}")
        sys.exit(2)