#!/bin/bash

# Pre-deployment system check for CatLink
# Проверяет готовность системы к развертыванию

set -e

# Цвета
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

success() { echo -e "${GREEN}✅ $1${NC}"; }
warning() { echo -e "${YELLOW}⚠️  $1${NC}"; }
error() { echo -e "${RED}❌ $1${NC}"; }
info() { echo -e "${BLUE}ℹ️  $1${NC}"; }

ERRORS=0
WARNINGS=0

check_and_report() {
    if $1; then
        success "$2"
    else
        error "$2"
        ((ERRORS++))
    fi
}

check_and_warn() {
    if $1; then
        success "$2"
    else
        warning "$2"
        ((WARNINGS++))
    fi
}

echo "🔍 ===== CatLink Pre-Deployment Check ====="
echo ""

# Проверка операционной системы
info "Проверка операционной системы..."
OS=$(lsb_release -si 2>/dev/null || echo "Unknown")
VERSION=$(lsb_release -sr 2>/dev/null || echo "Unknown")
echo "   OS: $OS $VERSION"

# Проверка архитектуры
ARCH=$(uname -m)
echo "   Architecture: $ARCH"

# Проверка прав sudo
check_and_report "sudo -n true 2>/dev/null" "Права sudo доступны"

# Проверка свободного места
info "Проверка дискового пространства..."
DISK_SPACE=$(df / | awk 'NR==2 {print $4}')
DISK_SPACE_GB=$((DISK_SPACE / 1024 / 1024))
echo "   Свободно: ${DISK_SPACE_GB}GB"

if [ $DISK_SPACE_GB -lt 5 ]; then
    error "Недостаточно места на диске (минимум 5GB)"
    ((ERRORS++))
elif [ $DISK_SPACE_GB -lt 10 ]; then
    warning "Мало места на диске (рекомендуется минимум 10GB)"
    ((WARNINGS++))
else
    success "Достаточно места на диске"
fi

# Проверка RAM
info "Проверка оперативной памяти..."
RAM_MB=$(free -m | awk 'NR==2{print $2}')
RAM_GB=$((RAM_MB / 1024))
echo "   RAM: ${RAM_GB}GB (${RAM_MB}MB)"

if [ $RAM_MB -lt 1024 ]; then
    error "Недостаточно RAM (минимум 1GB)"
    ((ERRORS++))
elif [ $RAM_MB -lt 2048 ]; then
    warning "Мало RAM (рекомендуется минимум 2GB)"
    ((WARNINGS++))
else
    success "Достаточно RAM"
fi

# Проверка Docker
echo ""
info "Проверка Docker..."
check_and_report "command -v docker >/dev/null 2>&1" "Docker установлен"

if command -v docker >/dev/null 2>&1; then
    DOCKER_VERSION=$(docker --version | cut -d' ' -f3 | cut -d',' -f1)
    echo "   Версия Docker: $DOCKER_VERSION"
    
    check_and_report "docker ps >/dev/null 2>&1" "Docker daemon запущен"
    check_and_report "docker info | grep -q 'Server Version'" "Docker доступен без sudo"
fi

# Проверка Docker Compose
# Проверка Docker Compose
echo ""
info "Проверка Docker Compose..."

# Проверяем Docker Compose v1 или v2
if command -v docker-compose >/dev/null 2>&1; then
    COMPOSE_VERSION=$(docker-compose --version | cut -d' ' -f3 | cut -d',' -f1)
    echo "   Версия Docker Compose v1: $COMPOSE_VERSION"
    success "Docker Compose v1 установлен"
elif docker compose version >/dev/null 2>&1; then
    COMPOSE_VERSION=$(docker compose version --short 2>/dev/null || docker compose version | head -1 | cut -d' ' -f4)
    echo "   Версия Docker Compose v2: $COMPOSE_VERSION"
    success "Docker Compose v2 установлен"
else
    error "Docker Compose не установлен"
    ((ERRORS++))
fi

# Проверка портов
echo ""
info "Проверка портов..."
check_port() {
    ! netstat -tuln 2>/dev/null | grep -q ":$1 " && ! ss -tuln 2>/dev/null | grep -q ":$1 "
}

check_and_warn "check_port 80" "Порт 80 свободен"
check_and_warn "check_port 443" "Порт 443 свободен"
check_and_warn "check_port 3000" "Порт 3000 свободен"
check_and_warn "check_port 8000" "Порт 8000 свободен"
check_and_warn "check_port 5432" "Порт 5432 свободен"

# Проверка nginx
echo ""
info "Проверка nginx..."
if command -v nginx >/dev/null 2>&1; then
    NGINX_VERSION=$(nginx -v 2>&1 | cut -d' ' -f3)
    success "nginx установлен ($NGINX_VERSION)"
    
    if systemctl is-active --quiet nginx; then
        warning "nginx уже запущен (может потребоваться перенастройка)"
    else
        success "nginx остановлен (готов к настройке)"
    fi
else
    warning "nginx не установлен (будет установлен автоматически)"
fi

# Проверка certbot
check_and_warn "command -v certbot >/dev/null 2>&1" "certbot установлен (будет установлен при необходимости)"

# Проверка Python
echo ""
info "Проверка Python..."
check_and_report "command -v python3 >/dev/null 2>&1" "Python 3 установлен"

if command -v python3 >/dev/null 2>&1; then
    PYTHON_VERSION=$(python3 --version | cut -d' ' -f2)
    echo "   Версия Python: $PYTHON_VERSION"
fi

# Проверка openssl
check_and_report "command -v openssl >/dev/null 2>&1" "OpenSSL установлен"

# Проверка файлов проекта
echo ""
info "Проверка файлов проекта..."
check_and_report "[ -f 'docker-compose.yml' ]" "docker-compose.yml найден"
check_and_report "[ -f 'Makefile' ]" "Makefile найден"
check_and_report "[ -d 'backend' ]" "Директория backend найдена"
check_and_report "[ -d 'frontend' ]" "Директория frontend найдена"

# Проверка git
if [ -d ".git" ]; then
    success "Git репозиторий найден"
    BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown")
    echo "   Текущая ветка: $BRANCH"
    
    if git status --porcelain | grep -q .; then
        warning "Есть неcommitted изменения"
    else
        success "Рабочая директория чистая"
    fi
else
    warning "Не Git репозиторий"
fi

# Проверка интернет соединения
echo ""
info "Проверка интернет соединения..."
check_and_report "ping -c 1 8.8.8.8 >/dev/null 2>&1" "Интернет соединение доступно"
check_and_report "ping -c 1 docker.io >/dev/null 2>&1" "Docker Hub доступен"

# Проверка DNS
if command -v nslookup >/dev/null 2>&1; then
    check_and_report "nslookup google.com >/dev/null 2>&1" "DNS работает"
fi

# Проверка firewall
echo ""
info "Проверка firewall..."
if command -v ufw >/dev/null 2>&1; then
    if ufw status | grep -q "Status: active"; then
        warning "UFW активен (может блокировать порты)"
        echo "   Убедитесь что порты 80, 443 открыты"
    else
        info "UFW неактивен"
    fi
fi

# Проверка SELinux (если есть)
if command -v getenforce >/dev/null 2>&1; then
    SELINUX_STATUS=$(getenforce 2>/dev/null || echo "Unknown")
    if [ "$SELINUX_STATUS" = "Enforcing" ]; then
        warning "SELinux в режиме Enforcing (может блокировать Docker)"
    else
        info "SELinux: $SELINUX_STATUS"
    fi
fi

# Итоговая сводка
echo ""
echo "📊 ===== ИТОГОВАЯ СВОДКА ====="
echo "Ошибки: $ERRORS, Предупреждения: $WARNINGS"
echo ""

if [ $ERRORS -eq 0 ] && [ $WARNINGS -eq 0 ]; then
    success "Система полностью готова к развертыванию!"
    echo ""
    echo "🚀 Можете запускать: make deploy"
    EXIT_CODE=0
elif [ $ERRORS -eq 0 ]; then
    warning "Система готова к развертыванию с предупреждениями ($WARNINGS)"
    echo ""
    echo "⚡ Можете запускать: make deploy"
    echo "   (предупреждения будут обработаны автоматически)"
    echo ""
    echo "📋 Найденные предупреждения не критичны:"
    echo "   - Мало RAM: рекомендуется 2GB, но 1GB достаточно для базовой работы"
    echo "   - Другие предупреждения можно проигнорировать"
    EXIT_CODE=0
else
    error "Обнаружены критические проблемы ($ERRORS ошибок, $WARNINGS предупреждений)"
    echo ""
    echo "🔧 Исправьте ошибки перед развертыванием:"
    echo "   - Установите недостающие компоненты"
    echo "   - Освободите дисковое пространство"
    echo "   - Настройте права доступа"
    EXIT_CODE=1
fi

echo ""
echo "💡 Полезные команды:"
echo "   make help           - Показать все доступные команды"
echo "   make deploy         - Запустить полное развертывание"
echo "   make security-audit - Проверить безопасность"
echo "   make logs          - Посмотреть логи"

exit $EXIT_CODE