#!/bin/bash
# deploy.sh

set -e

echo "🚀 شروع فرآیند استقرار ربات تلگرام..."

# رنگ‌ها برای خروجی
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# توابع کمکی
log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

check_dependencies() {
    log_info "بررسی وابستگی‌ها..."
    
    # Docker
    if ! command -v docker &> /dev/null; then
        log_error "Docker یافت نشد. لطفا نصب کنید."
        exit 1
    fi
    
    # Docker Compose
    if ! command -v docker-compose &> /dev/null; then
        log_error "Docker Compose یافت نشد. لطفا نصب کنید."
        exit 1
    fi
    
    log_info "✓ همه وابستگی‌ها موجود هستند"
}

setup_environment() {
    log_info "تنظیم محیط..."
    
    if [ ! -f .env ]; then
        log_warn "فایل .env یافت نشد. ایجاد از روی نمونه..."
        cp .env.example .env
        log_warn "لطفا فایل .env را ویرایش و مقادیر را تنظیم کنید."
        exit 1
    fi
    
    # لود متغیرهای محیطی
    source .env
    
    # بررسی متغیرهای ضروری
    required_vars=(
        "BOT_TOKEN"
        "ROOT_CHATID"
        "DB_USER"
        "DB_PASS"
        "DB_NAME"
        "ADMIN_PANEL_SECRET"
    )
    
    for var in "${required_vars[@]}"; do
        if [ -z "${!var}" ]; then
            log_error "متغیر $var در فایل .env تنظیم نشده است."
            exit 1
        fi
    done
    
    log_info "✓ محیط تنظیم شد"
}

setup_ssl() {
    log_info "تنظیم SSL..."
    
    if [ ! -d "./nginx/ssl" ]; then
        mkdir -p ./nginx/ssl
        
        # اگر دامنه تنظیم شده، از Let's Encrypt استفاده کن
        if [ -n "$DOMAIN_NAME" ]; then
            log_info "دریافت گواهی SSL از Let's Encrypt برای $DOMAIN_NAME..."
            
            # نصب certbot
            sudo apt-get update
            sudo apt-get install -y certbot python3-certbot-nginx
            
            # دریافت گواهی
            sudo certbot certonly --nginx \
                -d "$DOMAIN_NAME" \
                --email "$SSL_EMAIL" \
                --agree-tos \
                --no-eff-email
            
            # کپی گواهی‌ها
            sudo cp /etc/letsencrypt/live/$DOMAIN_NAME/fullchain.pem ./nginx/ssl/
            sudo cp /etc/letsencrypt/live/$DOMAIN_NAME/privkey.pem ./nginx/ssl/
            
            # تنظیم مجوزها
            sudo chmod 644 ./nginx/ssl/*.pem
        else
            log_warn "دامنه تنظیم نشده. استفاده از گواهی خودامضا..."
            
            # ایجاد گواهی خودامضا
            openssl req -x509 -nodes -days 365 \
                -newkey rsa:2048 \
                -keyout ./nginx/ssl/privkey.pem \
                -out ./nginx/ssl/fullchain.pem \
                -subj "/C=IR/ST=Tehran/L=Tehran/O=TelegramBot/CN=localhost"
        fi
    fi
    
    log_info "✓ SSL تنظیم شد"
}

migrate_database() {
    log_info "اجرای migrations پایگاه داده..."
    
    # منتظر بمان تا MySQL آماده شود
    log_info "منتظر MySQL..."
    while ! docker-compose exec mysql mysqladmin ping -h localhost --silent; do
        sleep 5
    done
    
    # اجرای migrations
    docker-compose exec backend python -c "
from app.database.connection import engine
from app.database.models import Base
Base.metadata.create_all(bind=engine)
print('✓ Tables created successfully')
    "
    
    log_info "✓ پایگاه داده آماده است"
}

setup_webhook() {
    log_info "تنظیم Webhook تلگرام..."
    
    if [ -z "$WEBHOOK_URL" ]; then
        log_warn "WEBHOOK_URL تنظیم نشده. رفع Webhook..."
        
        # رفع Webhook قبلی
        curl -X POST "https://api.telegram.org/bot$BOT_TOKEN/deleteWebhook"
        
        log_warn "ربات در حالت Polling اجرا می‌شود"
    else
        # تنظیم Webhook جدید
        response=$(curl -s -X POST "https://api.telegram.org/bot$BOT_TOKEN/setWebhook" \
            -H "Content-Type: application/json" \
            -d "{
                \"url\": \"$WEBHOOK_URL\",
                \"secret_token\": \"$WEBHOOK_SECRET\",
                \"max_connections\": 100,
                \"allowed_updates\": [\"message\", \"callback_query\", \"chat_member\"]
            }")
        
        if echo "$response" | grep -q '"ok":true'; then
            log_info "✓ Webhook تنظیم شد: $WEBHOOK_URL"
        else
            log_error "خطا در تنظیم Webhook: $response"
        fi
    fi
}

start_services() {
    log_info "راه‌اندازی سرویس‌ها..."
    
    # ساخت و اجرای کانتینرها
    docker-compose build --no-cache
    docker-compose up -d
    
    # منتظر بمان تا سرویس‌ها بالا بیایند
    log_info "منتظر سرویس‌ها..."
    sleep 10
    
    # بررسی وضعیت سرویس‌ها
    if docker-compose ps | grep -q "Up"; then
        log_info "✓ همه سرویس‌ها در حال اجرا هستند"
        
        # نمایش وضعیت
        echo ""
        echo "📊 وضعیت سرویس‌ها:"
        echo "========================"
        docker-compose ps
        
        echo ""
        echo "🌐 دسترسی‌ها:"
        echo "========================"
        echo "Frontend:   http://localhost:3000"
        echo "Backend:    http://localhost:8000"
        echo "MySQL:      localhost:3306"
        echo "Redis:      localhost:6379"
        echo "Prometheus: http://localhost:9090"
        echo "Grafana:    http://localhost:3001"
        echo ""
        
        # نمایش اطلاعات لاگین
        echo "🔑 اطلاعات ورود:"
        echo "========================"
        echo "Admin Panel: از توکن $ADMIN_PANEL_SECRET استفاده کنید"
        echo ""
        
        # بررسی سلامت
        echo "🩺 بررسی سلامت:"
        echo "========================"
        if curl -s http://localhost:8000/health | grep -q "healthy"; then
            echo "✓ Backend سالم است"
        else
            echo "✗ Backend مشکل دارد"
        fi
        
    else
        log_error "برخی سرویس‌ها راه‌اندازی نشدند"
        docker-compose logs
        exit 1
    fi
}

backup_database() {
    log_info "ایجاد پشتیبان از پایگاه داده..."
    
    TIMESTAMP=$(date +%Y%m%d_%H%M%S)
    BACKUP_DIR="./backups"
    
    mkdir -p "$BACKUP_DIR"
    
    docker-compose exec mysql mysqldump \
        -u "$DB_USER" \
        -p"$DB_PASS" \
        "$DB_NAME" \
        > "$BACKUP_DIR/backup_$TIMESTAMP.sql"
    
    # فشرده‌سازی
    gzip "$BACKUP_DIR/backup_$TIMESTAMP.sql"
    
    log_info "✓ پشتیبان ایجاد شد: $BACKUP_DIR/backup_$TIMESTAMP.sql.gz"
}

# اجرای مراحل اصلی
main() {
    echo ""
    echo "🤖 استقرار ربات تلگرام پیشرفته"
    echo "================================"
    echo ""
    
    check_dependencies
    setup_environment
    setup_ssl
    migrate_database
    setup_webhook
    start_services
    backup_database
    
    echo ""
    echo "🎉 استقرار با موفقیت انجام شد!"
    echo ""
    echo "برای مشاهده لاگ‌ها:"
    echo "  docker-compose logs -f"
    echo ""
    echo "برای توقف سرویس‌ها:"
    echo "  docker-compose down"
    echo ""
}

# اجرای اصلی
main "$@"