#!/bin/bash

echo "🔍 Улучшенное тестирование доступа контейнеров"
echo "=============================================="

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

echo ""
echo "🌐 Сетевые подключения:"
echo "======================="

echo ""
echo "1. 📡 Frontend (Next.js) доступ к API"
echo "------------------------------------"

# Проверяем доступные команды в frontend контейнере
echo "Доступные инструменты в frontend контейнере:"
docker exec links-frontend-1 sh -c "
which wget >/dev/null 2>&1 && echo '  ✅ wget доступен'
which curl >/dev/null 2>&1 && echo '  ✅ curl доступен' || echo '  ❌ curl недоступен'
which node >/dev/null 2>&1 && echo '  ✅ node доступен'
"

echo ""
echo "Тест подключения Frontend → Backend через Docker сеть:"
docker exec links-frontend-1 sh -c "
if which wget >/dev/null 2>&1; then
    echo 'Тестируем с wget...'
    if wget -q --timeout=10 -O- http://links-web-1:8000/api/ 2>/dev/null | head -1; then
        echo '✅ API доступен через внутреннюю сеть Docker'
    else
        echo '❌ API недоступен через внутреннюю сеть'
    fi
elif which node >/dev/null 2>&1; then
    echo 'Тестируем с Node.js...'
    node -e \"
    const http = require('http');
    const req = http.get('http://links-web-1:8000/api/', (res) => {
        console.log('✅ API доступен, статус:', res.statusCode);
    });
    req.on('error', () => console.log('❌ Ошибка подключения к API'));
    req.setTimeout(5000, () => console.log('⏰ Timeout'));
    \"
else
    echo '⚠️ Нет доступных инструментов для HTTP запросов'
fi
"

echo ""
echo "2. 🗄️ Backend подключение к БД"
echo "------------------------------"

echo "Проверка БД через Django ORM:"
docker exec links-web-1 python manage.py shell -c "
from django.db import connection
from django.contrib.auth import get_user_model

try:
    # Тест подключения
    cursor = connection.cursor()
    cursor.execute('SELECT version()')
    version = cursor.fetchone()[0]
    print(f'✅ PostgreSQL версия: {version[:30]}...')
    
    # Тест данных
    User = get_user_model()
    users_count = User.objects.count()
    print(f'✅ Пользователей в БД: {users_count}')
    
    # Тест таблиц
    cursor.execute(\"SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'\")
    tables = [row[0] for row in cursor.fetchall()]
    print(f'✅ Таблиц в БД: {len(tables)}')
    
    if 'users_user' in tables:
        print('✅ Таблица пользователей найдена')
    if 'api_link' in tables:
        print('✅ Таблица ссылок найдена')
        
except Exception as e:
    print(f'❌ Ошибка БД: {e}')
"

echo ""
echo "3. 🔄 Проверка API endpoints изнутри Backend"
echo "-------------------------------------------"

echo "Тест API endpoints через Python requests:"
docker exec links-web-1 python -c "
import os
import sys
sys.path.append('/app')
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'backend.settings')

import django
django.setup()

from django.test import Client
from django.urls import reverse

try:
    client = Client()
    
    # Тест API root
    response = client.get('/api/')
    print(f'API Root: {response.status_code} - {\"✅ OK\" if response.status_code == 200 else \"❌ Error\"}')
    
    # Тест Swagger
    response = client.get('/api/swagger/')
    print(f'Swagger: {response.status_code} - {\"✅ OK\" if response.status_code == 200 else \"❌ Error\"}')
    
    # Тест Auth
    response = client.get('/api/auth/login/')
    print(f'Auth Login: {response.status_code} - {\"✅ OK\" if response.status_code in [200, 405] else \"❌ Error\"}')
    
    # Тест Admin
    response = client.get('/admin/')
    print(f'Admin: {response.status_code} - {\"✅ OK (redirect)\" if response.status_code == 302 else \"❌ Error\"}')
    
except Exception as e:
    print(f'❌ Ошибка тестирования: {e}')
"

echo ""
echo "4. 📊 Анализ Docker сети"
echo "========================"

echo "Информация о сети:"
network_name=$(docker network ls --format "{{.Name}}" | grep catlink || echo "default")
docker network inspect "$network_name" --format "
Сеть: {{.Name}}
Подсеть: {{range .IPAM.Config}}{{.Subnet}}{{end}}
Шлюз: {{range .IPAM.Config}}{{.Gateway}}{{end}}
"

echo ""
echo "Маршруты в web контейнере:"
docker exec links-web-1 sh -c "
ip route 2>/dev/null | head -5 || route -n 2>/dev/null | head -5 || echo 'Команды маршрутизации недоступны'
"

echo ""
echo "5. 🔍 Проверка переменных окружения"
echo "==================================="

echo "Frontend environment:"
docker exec links-frontend-1 env | grep -E "NEXT|API|URL" | sort

echo ""
echo "Backend environment (Django):"
docker exec links-web-1 env | grep -E "DJANGO|DATABASE|DEBUG" | head -10

echo ""
echo "6. 📋 Логи контейнеров (последние строки)"
echo "========================================="

echo "📝 Backend логи:"
docker logs --tail=3 links-web-1 2>/dev/null | tail -3

echo ""
echo "📝 Frontend логи:"
docker logs --tail=3 links-frontend-1 2>/dev/null | tail -3

echo ""
echo "📝 Database логи:"
docker logs --tail=3 links-db-1 2>/dev/null | tail -3

echo ""
echo "🎯 ИТОГОВЫЙ СТАТУС:"
echo "==================="

# Финальная проверка доступности
echo -n "Frontend (3000): "
if docker exec links-frontend-1 sh -c "netstat -tln 2>/dev/null | grep :3000" >/dev/null; then
    echo "✅ Слушает порт"
else
    echo "⚠️ Порт не найден"
fi

echo -n "Backend (8000): "
if docker exec links-web-1 sh -c "netstat -tln 2>/dev/null | grep :8000" >/dev/null; then
    echo "✅ Слушает порт"
else
    echo "⚠️ Проверим через ss или другим способом"
    if docker exec links-web-1 python -c "import socket; s=socket.socket(); s.connect(('localhost', 8000)); print('✅ Порт 8000 доступен')" 2>/dev/null; then
        echo "✅ Порт доступен"
    else
        echo "❌ Порт недоступен"
    fi
fi

echo -n "Database (5432): "
docker exec links-web-1 python -c "
import socket
try:
    s = socket.socket()
    s.settimeout(3)
    s.connect(('links-db-1', 5432))
    print('✅ БД доступна')
    s.close()
except:
    print('❌ БД недоступна')
"

echo ""
echo "🚀 Тестирование завершено!"