#!/bin/bash

echo "🔍 Тестирование доступа контейнеров к API и БД"
echo "==============================================="

echo ""
echo "🐳 Статус контейнеров:"
echo "----------------------"
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"

echo ""
echo "🌐 Тестирование сетевых соединений между контейнерами:"
echo "======================================================"

echo ""
echo "1. 📡 Frontend → Backend API"
echo "----------------------------"
echo "Проверяем доступ frontend к backend через внутреннюю сеть Docker..."

# Тестируем подключение frontend к backend
docker exec links-frontend-1 sh -c "
echo 'Тест ping к web контейнеру:'
if ping -c 1 links-web-1 >/dev/null 2>&1; then
    echo '✅ Ping успешен'
else
    echo '❌ Ping неудачен'
fi

echo ''
echo 'Тест HTTP запроса к API:'
if command -v curl >/dev/null 2>&1; then
    echo 'Используем curl...'
    response=\$(curl -s -w '%{http_code}' -o /dev/null http://links-web-1:8000/api/ 2>/dev/null || echo 'ERROR')
    if [ \"\$response\" = 'ERROR' ]; then
        echo '❌ Ошибка подключения к API'
    else
        echo \"✅ API отвечает (HTTP \$response)\"
    fi
else
    echo 'curl не найден, используем wget...'
    if wget -q --spider http://links-web-1:8000/api/ 2>/dev/null; then
        echo '✅ API доступен через wget'
    else
        echo '❌ API недоступен'
    fi
fi
"

echo ""
echo "2. 🗄️ Backend → Database"
echo "------------------------"
echo "Проверяем доступ backend к базе данных..."

# Тестируем подключение backend к базе данных
docker exec links-web-1 sh -c "
echo 'Тест ping к БД контейнеру:'
if ping -c 1 links-db-1 >/dev/null 2>&1; then
    echo '✅ Ping к БД успешен'
else
    echo '❌ Ping к БД неудачен'
fi

echo ''
echo 'Тест подключения к PostgreSQL:'
if command -v pg_isready >/dev/null 2>&1; then
    if pg_isready -h links-db-1 -p 5432 >/dev/null 2>&1; then
        echo '✅ PostgreSQL доступен'
    else
        echo '❌ PostgreSQL недоступен'
    fi
else
    echo 'pg_isready не найден, пробуем через Python...'
fi

echo ''
echo 'Тест Django ORM подключения:'
cd /app
python manage.py shell -c \"
try:
    from django.db import connection
    cursor = connection.cursor()
    cursor.execute('SELECT 1')
    print('✅ Django ORM: подключение к БД успешно')
except Exception as e:
    print(f'❌ Django ORM ошибка: {e}')
\"
"

echo ""
echo "3. 🔄 Frontend → Backend (через внешний API)"
echo "--------------------------------------------"
echo "Проверяем, как frontend обращается к backend через nginx..."

# Проверяем переменные окружения frontend
docker exec links-frontend-1 sh -c "
echo 'Переменные окружения API:'
env | grep -E 'API|NEXT' | sort

echo ''
echo 'Тест внешнего API через nginx:'
if command -v curl >/dev/null 2>&1; then
    # Проверяем внешний доступ к API
    response=\$(curl -s -w '%{http_code}' -o /dev/null https://links.shareon.kr/api/ 2>/dev/null || echo 'ERROR')
    if [ \"\$response\" = 'ERROR' ]; then
        echo '❌ Внешний API недоступен'
    else
        echo \"✅ Внешний API доступен (HTTP \$response)\"
    fi
else
    echo 'curl недоступен для внешних запросов'
fi
"

echo ""
echo "4. 📊 Проверка внутренней Docker сети"
echo "-------------------------------------"
echo "Информация о Docker сети:"

# Получаем информацию о сети
network_name=$(docker network ls --format "{{.Name}}" | grep catlink || echo "bridge")
echo "Используемая сеть: $network_name"

echo ""
echo "IP адреса контейнеров в сети:"
for container in links-web-1 links-db-1 links-frontend-1; do
    if docker ps --format "{{.Names}}" | grep -q "^$container$"; then
        ip=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$container" 2>/dev/null || echo "N/A")
        echo "  • $container: $ip"
    else
        echo "  • $container: не найден"
    fi
done

echo ""
echo "5. 🔍 Проверка портов внутри контейнеров"
echo "----------------------------------------"

echo "Порты в web контейнере:"
docker exec links-web-1 sh -c "netstat -tlnp 2>/dev/null | grep -E ':8000|:5432' || ss -tlnp | grep -E ':8000|:5432'" || echo "netstat/ss недоступен"

echo ""
echo "Порты в frontend контейнере:"
docker exec links-frontend-1 sh -c "netstat -tlnp 2>/dev/null | grep :3000 || ss -tlnp | grep :3000" || echo "netstat/ss недоступен"

echo ""
echo "6. 📋 Тест Django команд"
echo "------------------------"
echo "Проверяем Django команды и миграции..."

docker exec links-web-1 sh -c "
cd /app
echo 'Проверка миграций:'
python manage.py showmigrations --verbosity=0 2>/dev/null | head -10 || echo 'Ошибка showmigrations'

echo ''
echo 'Проверка пользователей в БД:'
python manage.py shell -c \"
try:
    from django.contrib.auth import get_user_model
    User = get_user_model()
    count = User.objects.count()
    print(f'Пользователей в БД: {count}')
    if count > 0:
        print('✅ БД содержит данные')
    else:
        print('⚠️ БД пустая (это нормально для новой установки)')
except Exception as e:
    print(f'❌ Ошибка запроса к БД: {e}')
\"
"

echo ""
echo "7. 🔐 Тест API авторизации"
echo "--------------------------"
echo "Проверяем доступность API endpoints..."

# Тестируем основные API endpoints
endpoints=(
    "/api/"
    "/api/auth/login/"
    "/api/auth/register/"
    "/api/swagger/"
)

for endpoint in "${endpoints[@]}"; do
    echo -n "Тест $endpoint: "
    response=$(docker exec links-web-1 curl -s -w '%{http_code}' -o /dev/null "http://localhost:8000$endpoint" 2>/dev/null || echo "ERROR")
    
    case $response in
        200)
            echo "✅ OK ($response)"
            ;;
        301|302)
            echo "🔄 Redirect ($response)"
            ;;
        405)
            echo "✅ Method not allowed ($response) - endpoint существует"
            ;;
        404)
            echo "❌ Not found ($response)"
            ;;
        ERROR)
            echo "❌ Connection error"
            ;;
        *)
            echo "⚠️ Status: $response"
            ;;
    esac
done

echo ""
echo "🎯 РЕЗЮМЕ ТЕСТИРОВАНИЯ:"
echo "======================"
echo "✅ Тестирование доступа контейнеров завершено"
echo ""
echo "Для дополнительной диагностики используйте:"
echo "  • docker logs links-web-1 - логи Django"
echo "  • docker logs links-db-1 - логи PostgreSQL"
echo "  • docker logs links-frontend-1 - логи Next.js"
echo "  • docker exec -it links-web-1 bash - войти в контейнер"
echo "  • docker network inspect \$(docker network ls --format '{{.Name}}' | grep catlink) - детали сети"