#!/usr/bin/env python

import json
import requests
import sys
import traceback
from datetime import date

# API Gateway endpoint
BASE_URL = "http://localhost:8004"

# Токен для аутентификации - замените на действующий токен
AUTH_TOKEN = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIyOSIsImVtYWlsIjoidGVzdDJAZXhhbXBsZS5jb20iLCJleHAiOjE3NTg4NjY5ODJ9._AXkBLeMI4zxC9shFUS3744miuyO8CDnJD1X1AqbLsw"

def test_health():
    """Проверка доступности сервиса"""
    try:
        response = requests.get(f"{BASE_URL}/health")
        print(f"Статус сервиса: {response.status_code}")
        print(f"Ответ: {response.text}")
        return response.status_code == 200
    except Exception as e:
        print(f"Ошибка при проверке сервиса: {e}")
        return False

def test_authenticated_endpoint():
    """Тестирование аутентифицированного эндпоинта для мобильного приложения"""
    print("\n=== Тестирование аутентифицированного эндпоинта ===")
    
    # Данные в формате мобильного приложения
    mobile_data = {
        "date": date.today().isoformat(),
        "type": "MENSTRUATION",
        "flow_intensity": 3,
        "symptoms": ["CRAMPS", "HEADACHE"],
        "mood": "NORMAL",
        "notes": "Запись из мобильного приложения через аутентифицированный эндпоинт"
    }
    
    print(f"Отправляемые данные: {json.dumps(mobile_data, indent=2)}")
    
    headers = {
        "Content-Type": "application/json",
        "Authorization": f"Bearer {AUTH_TOKEN}"
    }
    
    try:
        response = requests.post(
            f"{BASE_URL}/api/v1/calendar/entries/mobile",
            headers=headers,
            json=mobile_data,
            timeout=10
        )
        
        print(f"Статус ответа: {response.status_code}")
        
        if response.status_code >= 200 and response.status_code < 300:
            print(f"Тело успешного ответа: {json.dumps(response.json(), indent=2)}")
            return True
        else:
            print("Ошибка при создании записи через аутентифицированный эндпоинт")
            try:
                print(f"Тело ответа с ошибкой: {json.dumps(response.json(), indent=2)}")
            except:
                print(f"Тело ответа не является JSON: {response.text}")
            return False
    except Exception as e:
        print(f"Ошибка при выполнении запроса: {e}")
        traceback.print_exc()
        return False

def test_debug_endpoint():
    """Тестирование отладочного эндпоинта для мобильного приложения (без аутентификации)"""
    print("\n=== Тестирование отладочного эндпоинта (без аутентификации) ===")
    
    # Данные в формате мобильного приложения
    mobile_data = {
        "date": date.today().isoformat(),
        "type": "MENSTRUATION",
        "flow_intensity": 4,
        "symptoms": ["BACKACHE", "BLOATING"],
        "mood": "HAPPY",
        "notes": "Запись из мобильного приложения через отладочный эндпоинт"
    }
    
    print(f"Отправляемые данные: {json.dumps(mobile_data, indent=2)}")
    
    headers = {
        "Content-Type": "application/json"
    }
    
    try:
        response = requests.post(
            f"{BASE_URL}/debug/mobile-entry",
            headers=headers,
            json=mobile_data,
            timeout=10
        )
        
        print(f"Статус ответа: {response.status_code}")
        
        if response.status_code >= 200 and response.status_code < 300:
            print(f"Тело успешного ответа: {json.dumps(response.json(), indent=2)}")
            return True
        else:
            print("Ошибка при создании записи через отладочный эндпоинт")
            try:
                print(f"Тело ответа с ошибкой: {json.dumps(response.json(), indent=2)}")
            except:
                print(f"Тело ответа не является JSON: {response.text}")
            return False
    except Exception as e:
        print(f"Ошибка при выполнении запроса: {e}")
        traceback.print_exc()
        return False

def verify_entries_created():
    """Проверка, что записи были созданы в БД"""
    print("\n=== Проверка созданных записей ===")
    
    try:
        response = requests.get(f"{BASE_URL}/debug/entries")
        
        print(f"Статус ответа: {response.status_code}")
        
        if response.status_code == 200:
            entries = response.json()
            print(f"Количество записей в БД: {len(entries)}")
            print("Последние 2 записи:")
            for entry in entries[-2:]:
                print(json.dumps(entry, indent=2))
            return True
        else:
            print(f"Ошибка при получении записей: {response.status_code}")
            return False
    except Exception as e:
        print(f"Ошибка при проверке записей: {e}")
        traceback.print_exc()
        return False

def main():
    print("=== Тестирование мобильных эндпоинтов календарного сервиса ===")
    
    if not test_health():
        print("Сервис недоступен. Завершение тестирования.")
        return 1
    
    debug_result = test_debug_endpoint()
    auth_result = test_authenticated_endpoint()
    
    if debug_result and auth_result:
        print("\nВсе тесты успешно пройдены!")
        verify_entries_created()
        return 0
    else:
        print("\nНекоторые тесты не пройдены.")
        if debug_result:
            print("✓ Отладочный эндпоинт работает")
        else:
            print("✗ Отладочный эндпоинт не работает")
            
        if auth_result:
            print("✓ Аутентифицированный эндпоинт работает")
        else:
            print("✗ Аутентифицированный эндпоинт не работает")
        
        verify_entries_created()
        return 1

if __name__ == "__main__":
    sys.exit(main())