#!/bin/bash

# Скрипт для запуска API Gateway с зависимостями для приложения Women Safety

# Устанавливаем цветные сообщения
GREEN="\033[1;32m"
BLUE="\033[1;34m"
YELLOW="\033[1;33m"
RED="\033[1;31m"
RESET="\033[0m"

echo -e "${BLUE}🚀 Запуск API Gateway и необходимых сервисов...${RESET}"

# Переход в директорию проекта
cd "$(dirname "$0")" || { echo -e "${RED}Не удалось перейти в директорию проекта${RESET}"; exit 1; }

# Активация виртуального окружения, если оно существует
if [ -d "venv" ]; then
    echo -e "${YELLOW}🔄 Активация виртуального окружения venv...${RESET}"
    source venv/bin/activate
elif [ -d ".venv" ]; then
    echo -e "${YELLOW}🔄 Активация виртуального окружения .venv...${RESET}"
    source .venv/bin/activate
else
    echo -e "${YELLOW}⚠️  Виртуальное окружение не найдено, продолжаем без него...${RESET}"
fi

# Установка переменной PYTHONPATH
export PYTHONPATH="${PWD}:${PYTHONPATH}"

# Функция для проверки, запущен ли сервис на указанном порту
check_service() {
    local port=$1
    local service_name=$2
    
    if lsof -ti:$port > /dev/null 2>&1; then
        echo -e "${GREEN}✅ Сервис $service_name уже запущен на порту $port${RESET}"
        return 0
    else
        echo -e "${YELLOW}⚠️  Сервис $service_name не запущен на порту $port${RESET}"
        return 1
    fi
}

# Функция для запуска сервиса
start_service() {
    local port=$1
    local service_path=$2
    local service_name=$3
    
    echo -e "${BLUE}🚀 Запуск $service_name на порту $port...${RESET}"
    cd "$service_path" || { echo -e "${RED}❌ Не удалось перейти в директорию $service_path${RESET}"; return 1; }
    
    # Запускаем сервис в фоновом режиме
    python -m uvicorn main:app --host 0.0.0.0 --port $port &
    local pid=$!
    
    # Ждем 3 секунды и проверяем, запустился ли сервис
    sleep 3
    if kill -0 $pid 2>/dev/null; then
        echo -e "${GREEN}✅ Сервис $service_name успешно запущен (PID: $pid)${RESET}"
        # Возвращаемся в корневую директорию
        cd "$(dirname "$0")" || { echo -e "${RED}Не удалось вернуться в корневую директорию${RESET}"; exit 1; }
        return 0
    else
        echo -e "${RED}❌ Не удалось запустить сервис $service_name${RESET}"
        # Возвращаемся в корневую директорию
        cd "$(dirname "$0")" || { echo -e "${RED}Не удалось вернуться в корневую директорию${RESET}"; exit 1; }
        return 1
    fi
}

# Проверяем и запускаем пользовательский сервис (создаёт таблицы пользователей)
if ! check_service 8001 "User Service"; then
    start_service 8001 "./services/user_service" "User Service"
fi

# Проверяем и запускаем сервис календаря
if ! check_service 8004 "Calendar Service"; then
    start_service 8004 "./services/calendar_service" "Calendar Service"
fi

# Проверяем и запускаем сервис оповещений об экстренных ситуациях
if ! check_service 8002 "Emergency Service"; then
    start_service 8002 "./services/emergency_service" "Emergency Service"
fi

# Проверяем и запускаем сервис локаций
if ! check_service 8003 "Location Service"; then
    start_service 8003 "./services/location_service" "Location Service"
fi

# Проверяем и запускаем сервис уведомлений
if ! check_service 8005 "Notification Service"; then
    start_service 8005 "./services/notification_service" "Notification Service"
fi

# Ждем несколько секунд, чтобы сервисы успели инициализироваться
echo -e "${YELLOW}⏳ Ожидаем инициализацию сервисов (5 сек)...${RESET}"
sleep 5

# Функция для проверки здоровья сервиса
check_health() {
    local url=$1
    local service_name=$2
    
    if curl -s "$url" > /dev/null 2>&1; then
        echo -e "${GREEN}✅ Проверка здоровья $service_name успешна${RESET}"
        return 0
    else
        echo -e "${RED}❌ Проверка здоровья $service_name не удалась${RESET}"
        return 1
    fi
}

# Проверяем здоровье запущенных сервисов
check_health "http://localhost:8001/health" "User Service"
check_health "http://localhost:8002/health" "Emergency Service"
check_health "http://localhost:8003/health" "Location Service"
check_health "http://localhost:8004/health" "Calendar Service"
check_health "http://localhost:8005/health" "Notification Service"

# Теперь запускаем API Gateway
echo -e "${BLUE}🔄 Запуск API Gateway на порту 8000...${RESET}"

# Порт для API Gateway
API_GATEWAY_PORT=8000

# Проверяем, не занят ли порт уже
if lsof -ti:$API_GATEWAY_PORT > /dev/null 2>&1; then
    echo -e "${YELLOW}⚠️  Порт $API_GATEWAY_PORT уже занят, освобождаем...${RESET}"
    lsof -ti:$API_GATEWAY_PORT | xargs kill -9
    sleep 1
fi

# Запускаем API Gateway в текущем терминале (не в фоне)
echo -e "${GREEN}✅ Запуск API Gateway...${RESET}"
cd services/api_gateway || { echo -e "${RED}Не удалось перейти в директорию API Gateway${RESET}"; exit 1; }
python -m uvicorn main:app --host 0.0.0.0 --port $API_GATEWAY_PORT --reload