#!/bin/bash
# ============================================
# FileDummy Sample Shell Script
# Purpose: Deploy application to production
# Usage: ./deploy.sh [environment]
# ============================================

set -euo pipefail

# ── Configuration ────────────────────────────
APP_NAME="sample-app"
APP_DIR="/opt/${APP_NAME}"
BACKUP_DIR="/opt/backups/${APP_NAME}"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
ENVIRONMENT="${1:-staging}"

# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'

log() {
    echo -e "[$(date +'%Y-%m-%d %H:%M:%S')] $1"
}

error() {
    echo -e "${RED}[ERROR]${NC} $1" >&2
    exit 1
}

# ── Pre-flight checks ────────────────────────
check_dependencies() {
    local deps=("docker" "docker-compose" "curl")
    for dep in "${deps[@]}"; do
        if ! command -v "$dep" &>/dev/null; then
            error "Missing dependency: $dep"
        fi
    done
    log "${GREEN}All dependencies satisfied${NC}"
}

# ── Backup current deployment ────────────────
backup_current() {
    if [ -d "$APP_DIR" ]; then
        log "Backing up current deployment..."
        mkdir -p "$BACKUP_DIR"
        tar -czf "${BACKUP_DIR}/${TIMESTAMP}.tar.gz" -C "$APP_DIR" .
        log "Backup saved: ${BACKUP_DIR}/${TIMESTAMP}.tar.gz"
    fi
}

# ── Deploy ───────────────────────────────────
deploy() {
    log "Deploying ${APP_NAME} to ${ENVIRONMENT}..."
    cd "$APP_DIR"
    docker-compose pull
    docker-compose up -d --remove-orphans

    # Wait for health check
    local retries=30
    while [ $retries -gt 0 ]; do
        if curl -sf http://localhost:3000/health >/dev/null 2>&1; then
            log "${GREEN}Application is healthy!${NC}"
            return 0
        fi
        retries=$((retries - 1))
        sleep 2
    done
    error "Application failed health check"
}

# ── Main ─────────────────────────────────────
main() {
    log "Starting deployment of ${APP_NAME}"
    check_dependencies
    backup_current
    deploy
    log "${GREEN}Deployment complete!${NC}"
}

main "$@"
