#!/usr/bin/env bash
# =============================================================================
# deploy.sh — Plataforma ONG · ong.ybycomunicacao.com.br
# Uso: bash deploy.sh [--skip-backup] [--skip-migrate]
# =============================================================================
set -euo pipefail

# ── Configuração ──────────────────────────────────────────────────────────────
APP_DIR="/var/www/ong-plataforma"
BACKUP_DIR="$HOME/backups/ong"
LOG_FILE="$APP_DIR/storage/logs/deploy.log"
TIMESTAMP=$(date +"%Y-%m-%d %H:%M:%S")
DB_NAME=$(grep '^DB_DATABASE=' "$APP_DIR/.env" | cut -d= -f2)
DB_USER=$(grep '^DB_USERNAME=' "$APP_DIR/.env" | cut -d= -f2)
DB_PASS=$(grep '^DB_PASSWORD=' "$APP_DIR/.env" | cut -d= -f2)

# ── Flags ─────────────────────────────────────────────────────────────────────
SKIP_BACKUP=false
SKIP_MIGRATE=false

for arg in "$@"; do
    case $arg in
        --skip-backup)  SKIP_BACKUP=true ;;
        --skip-migrate) SKIP_MIGRATE=true ;;
    esac
done

# ── Helpers ───────────────────────────────────────────────────────────────────
log() { echo "[$(date +%H:%M:%S)] $*" | tee -a "$LOG_FILE"; }
ok()  { echo "  ✓ $*"; }
err() { echo "  ✗ ERRO: $*" >&2; exit 1; }

# ── Pré-checks ────────────────────────────────────────────────────────────────
[[ -f "$APP_DIR/.env" ]] || err ".env não encontrado em $APP_DIR"
[[ -f "$APP_DIR/artisan" ]] || err "artisan não encontrado — diretório correto?"

cd "$APP_DIR"

log "=========================================="
log "Deploy iniciado — $TIMESTAMP"
log "=========================================="

# ── 1. Backup ─────────────────────────────────────────────────────────────────
if [[ "$SKIP_BACKUP" == false ]]; then
    log "1/8 Backup do banco de dados..."
    mkdir -p "$BACKUP_DIR"
    BACKUP_FILE="$BACKUP_DIR/${DB_NAME}-$(date +%Y%m%d-%H%M%S).sql.gz"

    mysqldump -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" \
        --single-transaction --quick --lock-tables=false \
        | gzip > "$BACKUP_FILE"

    ok "Backup em $BACKUP_FILE"

    # Mantém apenas os 10 backups mais recentes
    ls -t "$BACKUP_DIR"/*.sql.gz 2>/dev/null | tail -n +11 | xargs rm -f
else
    log "1/8 Backup ignorado (--skip-backup)"
fi

# ── 2. Modo de manutenção ─────────────────────────────────────────────────────
log "2/8 Ativando modo de manutenção..."
php artisan down --render="errors.503" --retry=60 2>/dev/null || true
ok "Modo de manutenção ativo"

# ── 3. Atualizar código ───────────────────────────────────────────────────────
log "3/8 Atualizando código..."
if git rev-parse --git-dir > /dev/null 2>&1; then
    git pull origin main --ff-only
    COMMIT=$(git log -1 --pretty=format:"%h — %s")
    ok "Código atualizado: $COMMIT"
else
    log "  (sem repositório Git — código atualizado externamente)"
fi

# ── 4. Dependências ───────────────────────────────────────────────────────────
log "4/8 Instalando dependências Composer..."
composer install \
    --no-dev \
    --optimize-autoloader \
    --no-interaction \
    --prefer-dist \
    --quiet
ok "Composer concluído"

# ── 5. Migrations ─────────────────────────────────────────────────────────────
if [[ "$SKIP_MIGRATE" == false ]]; then
    log "5/8 Executando migrations..."
    php artisan migrate --force --no-interaction
    ok "Migrations aplicadas"
else
    log "5/8 Migrations ignoradas (--skip-migrate)"
fi

# ── 6. Cache de configuração ──────────────────────────────────────────────────
log "6/8 Gerando caches..."
php artisan config:clear
php artisan route:clear
php artisan view:clear

php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan permission:cache-reset 2>/dev/null || true
ok "Caches gerados"

# ── 7. Permissões ─────────────────────────────────────────────────────────────
log "7/8 Ajustando permissões..."
sudo chown -R www-data:www-data storage bootstrap/cache 2>/dev/null \
    || chown -R www-data:www-data storage bootstrap/cache 2>/dev/null \
    || log "  (aviso: não foi possível ajustar dono — verifique manualmente)"
chmod -R 775 storage bootstrap/cache
ok "Permissões ajustadas"

# ── 8. Voltar ao ar ───────────────────────────────────────────────────────────
log "8/8 Desativando modo de manutenção..."
php artisan up
ok "Aplicação online"

# ── Verificação final ─────────────────────────────────────────────────────────
log "Verificando resposta HTTP..."
HTTP_STATUS=$(curl -s -o /dev/null -w "%{http_code}" \
    --max-time 10 \
    http://ong.ybycomunicacao.com.br 2>/dev/null || echo "000")

if [[ "$HTTP_STATUS" == "200" || "$HTTP_STATUS" == "302" ]]; then
    ok "HTTP $HTTP_STATUS — aplicação respondendo normalmente"
else
    log "  ⚠ HTTP $HTTP_STATUS — verifique os logs: tail -f storage/logs/laravel.log"
fi

log "=========================================="
log "Deploy concluído com sucesso!"
log "=========================================="
