#!/bin/bash

# Emergency Service API Testing Script
# Скрипт для тестирования всех endpoints Emergency Service API

set -e  # Остановка при ошибке

# Конфигурация
BASE_URL="http://127.0.0.1:8002"
GATEWAY_URL="http://127.0.0.1:8000"
USER_URL="http://127.0.0.1:8001"

# Цвета для вывода
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# Функции для вывода
success() {
    echo -e "${GREEN}✅ $1${NC}"
}

error() {
    echo -e "${RED}❌ $1${NC}"
}

info() {
    echo -e "${BLUE}ℹ️  $1${NC}"
}

warning() {
    echo -e "${YELLOW}⚠️  $1${NC}"
}

# Функция для создания пользователя и получения токена
get_auth_token() {
    info "Получение токена авторизации..."
    
    # Создаем тестового пользователя
    local timestamp=$(date +%s)
    local test_username="testuser_${timestamp}"
    local test_email="testuser_${timestamp}@example.com"
    
    # Регистрируем пользователя
    local register_response=$(curl -s -X POST "${USER_URL}/api/v1/auth/register" \
        -H "Content-Type: application/json" \
        -d "{
            \"username\": \"${test_username}\",
            \"email\": \"${test_email}\",
            \"password\": \"testpass123\",
            \"full_name\": \"Test User ${timestamp}\"
        }")
    
    if echo "$register_response" | grep -q '"id"'; then
        success "Пользователь зарегистрирован: ${test_username}"
    else
        error "Ошибка регистрации: $register_response"
        return 1
    fi
    
    # Получаем токен
    local login_response=$(curl -s -X POST "${USER_URL}/api/v1/auth/login" \
        -H "Content-Type: application/json" \
        -d "{
            \"username\": \"${test_username}\",
            \"password\": \"testpass123\"
        }")
    
    local token=$(echo "$login_response" | grep -o '"access_token":"[^"]*' | cut -d'"' -f4)
    
    if [ -n "$token" ]; then
        success "Токен получен"
        echo "$token"
    else
        error "Ошибка получения токена: $login_response"
        return 1
    fi
}

# Функция для выполнения HTTP запросов
make_request() {
    local method="$1"
    local endpoint="$2"
    local data="$3"
    local token="$4"
    
    if [ -n "$data" ]; then
        curl -s -X "$method" "${BASE_URL}${endpoint}" \
            -H "Content-Type: application/json" \
            -H "Authorization: Bearer $token" \
            -d "$data"
    else
        curl -s -X "$method" "${BASE_URL}${endpoint}" \
            -H "Authorization: Bearer $token"
    fi
}

# Функция для проверки ответа
check_response() {
    local response="$1"
    local test_name="$2"
    
    # Проверяем статус код и содержание ответа
    if [ -n "$response" ] && (echo "$response" | grep -q '"id"\\|"status":"healthy"\\|"message"\\|"access_token"\\|"uuid"' || [ "${response:0:1}" = "{" ]); then
        success "$test_name: Успешно"
        echo "$response" | jq . 2>/dev/null || echo "$response"
        return 0
    else
        error "$test_name: Ошибка"
        echo "$response"
        return 1
    fi
}

main() {
    info "🚀 Начало тестирования Emergency Service API"
    echo "=============================================="
    
    # 1. Проверка здоровья сервиса
    info "1. Проверка здоровья сервиса"
    local health_response=$(curl -s "${BASE_URL}/health")
    check_response "$health_response" "Health Check"
    echo ""
    
    # 2. Получение токена авторизации
    info "2. Получение токена авторизации"
    local auth_token
    auth_token=$(get_auth_token)
    if [ $? -ne 0 ]; then
        error "Не удалось получить токен авторизации. Завершение тестов."
        exit 1
    fi
    echo ""
    
    # 3. Создание экстренного оповещения
    info "3. Создание экстренного оповещения"
    local alert_data='{
        "latitude": 55.7558,
        "longitude": 37.6176,
        "alert_type": "general",
        "message": "Тестовое оповещение - нужна помощь",
        "address": "Красная площадь, Москва"
    }'
    
    local alert_response=$(make_request "POST" "/api/v1/alert" "$alert_data" "$auth_token")
    if check_response "$alert_response" "Create Alert"; then
        local alert_id=$(echo "$alert_response" | grep -o '"id":[0-9]*' | cut -d':' -f2)
        success "Alert ID: $alert_id"
    fi
    echo ""
    
    # 4. Получение статистики
    info "4. Получение статистики"
    local stats_response=$(make_request "GET" "/api/v1/stats" "" "$auth_token")
    check_response "$stats_response" "Get Statistics"
    echo ""
    
    # 5. Получение активных оповещений
    info "5. Получение активных оповещений"
    local active_response=$(make_request "GET" "/api/v1/alerts/active" "" "$auth_token")
    check_response "$active_response" "Get Active Alerts"
    echo ""
    
    # 6. Получение моих оповещений
    info "6. Получение моих оповещений"
    local my_alerts_response=$(make_request "GET" "/api/v1/alerts/my" "" "$auth_token")
    check_response "$my_alerts_response" "Get My Alerts"
    echo ""
    
    # 7. Получение ближайших оповещений
    info "7. Получение ближайших оповещений"
    local nearby_response=$(make_request "GET" "/api/v1/alerts/nearby?latitude=55.7558&longitude=37.6176&radius_km=10" "" "$auth_token")
    check_response "$nearby_response" "Get Nearby Alerts"
    echo ""
    
    # 8. Создание отчета о происшествии
    info "8. Создание отчета о происшествии"
    local report_data='{
        "latitude": 55.7500,
        "longitude": 37.6200,
        "report_type": "harassment",
        "description": "Тестовый отчет о происшествии в районе метро",
        "address": "Тверская улица, Москва",
        "severity": 3,
        "is_anonymous": false
    }'
    
    local report_response=$(make_request "POST" "/api/v1/report" "$report_data" "$auth_token")
    check_response "$report_response" "Create Report"
    echo ""
    
    # 9. Получение отчетов
    info "9. Получение отчетов"
    local reports_response=$(make_request "GET" "/api/v1/reports" "" "$auth_token")
    check_response "$reports_response" "Get Reports"
    echo ""
    
    # 10. Создание отметки безопасности
    info "10. Создание отметки безопасности"
    local safety_data='{
        "message": "Добрался домой, все хорошо",
        "location_latitude": 55.7600,
        "location_longitude": 37.6100
    }'
    
    local safety_response=$(make_request "POST" "/api/v1/safety-check" "$safety_data" "$auth_token")
    check_response "$safety_response" "Create Safety Check"
    echo ""
    
    # 11. Получение отметок безопасности
    info "11. Получение отметок безопасности"
    local safety_checks_response=$(make_request "GET" "/api/v1/safety-checks" "" "$auth_token")
    check_response "$safety_checks_response" "Get Safety Checks"
    echo ""
    
    # 12. Тест отклика на оповещение (если есть активные оповещения)
    if [ -n "$alert_id" ] && [ "$alert_id" != "null" ]; then
        info "12. Создание второго пользователя для отклика"
        local second_token
        second_token=$(get_auth_token)
        if [ $? -eq 0 ]; then
            info "13. Отклик на оповещение"
            local response_data='{
                "response_type": "help_on_way",
                "message": "Еду к вам, буду через 15 минут!",
                "eta_minutes": 15
            }'
            
            local respond_response=$(make_request "POST" "/api/v1/alert/${alert_id}/respond" "$response_data" "$second_token")
            check_response "$respond_response" "Respond to Alert"
            echo ""
            
            # 14. Получение откликов на оповещение
            info "14. Получение откликов на оповещение"
            local responses_response=$(make_request "GET" "/api/v1/alert/${alert_id}/responses" "" "$auth_token")
            check_response "$responses_response" "Get Alert Responses"
            echo ""
            
            # 15. Обновление оповещения
            info "15. Обновление оповещения"
            local update_data='{
                "message": "Обновленное описание ситуации"
            }'
            
            local update_response=$(make_request "PUT" "/api/v1/alert/${alert_id}" "$update_data" "$auth_token")
            check_response "$update_response" "Update Alert"
            echo ""
            
            # 16. Решение оповещения
            info "16. Решение оповещения"
            local resolve_response=$(make_request "PUT" "/api/v1/alert/${alert_id}/resolve" "" "$auth_token")
            check_response "$resolve_response" "Resolve Alert"
            echo ""
        fi
    fi
    
    info "✅ Тестирование Emergency Service API завершено"
    success "Все основные endpoints протестированы!"
}

# Запуск основной функции
main "$@"