#!/usr/bin/env bash
#
# Cavendral Beta — deploy script
# Roda em /opt/cavendral/current (Apache DocumentRoot aponta pra /public)
#
# Uso: scripts/deploy.sh [branch|tag]
#
set -euo pipefail

BRANCH="${1:-main}"
APP_DIR="/opt/cavendral/current"
BACKUP_DIR="/opt/cavendral/backups"
RELEASES_DIR="/opt/cavendral/releases"

TS=$(date +%Y%m%d%H%M%S)
RELEASE_DIR="${RELEASES_DIR}/${TS}"

echo "==> Cavendral Beta deploy"
echo "Branch/tag: ${BRANCH}"
echo "Release dir: ${RELEASE_DIR}"

# Pré-requisitos
command -v git >/dev/null 2>&1 || { echo "ERRO: git não encontrado"; exit 1; }
command -v composer >/dev/null 2>&1 || { echo "ERRO: composer não encontrado"; exit 1; }
command -v php >/dev/null 2>&1 || { echo "ERRO: php não encontrado"; exit 1; }
[[ -f /opt/cavendral/.env ]] || { echo "ERRO: /opt/cavendral/.env não existe"; exit 1; }

mkdir -p "${RELEASES_DIR}" "${BACKUP_DIR}"

# 1. Clone release nova
echo "==> Clonando código..."
rm -rf /tmp/cavendral-deploy
git clone --depth 1 --branch "${BRANCH}" https://github.com/cavendral/beta-portal.git /tmp/cavendral-deploy
mv /tmp/cavendral-deploy "${RELEASE_DIR}"

# 2. Composer install (no-dev, optimize)
echo "==> Composer install..."
cd "${RELEASE_DIR}"
composer install --no-dev --prefer-dist --optimize-autoloader --no-interaction

# 3. Copiar .env do diretório compartilhado
cp /opt/cavendral/.env "${RELEASE_DIR}/.env"

# 4. Migrations (DDL-only user)
echo "==> Migrations..."
php artisan migrate --force --isolated || {
    echo "ERRO: migration falhou. Rollback para o release anterior.";
    if [[ -L "${APP_DIR}" ]]; then
        PREV=$(readlink "${APP_DIR}")
        echo "Release atual preservado: ${PREV}"
    fi
    exit 1
}

# 5. Cache configs
echo "==> Cache configs/routes/views..."
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan event:cache
php artisan optimize:clear

# 6. Vite build (se npm disponível)
if command -v npm >/dev/null 2>&1; then
    echo "==> npm install + build..."
    npm ci --no-audit --no-fund
    npm run build
else
    echo "WARN: npm não disponível — assets pré-compilados devem estar no release."
fi

# 7. Storage symlinks
ln -sfn /opt/cavendral/storage "${RELEASE_DIR}/storage"

# 8. Symlink swap
echo "==> Swap symlink ${APP_DIR} -> ${RELEASE_DIR}"
ln -sfn "${RELEASE_DIR}" "${APP_DIR}"

# 9. Reload Apache + Supervisor
systemctl reload apache2 || systemctl reload httpd || true
supervisorctl restart "cavendral-default:*" || true
supervisorctl restart "cavendral-emails:*" || true
supervisorctl restart "cavendral-heavy:*" || true

# 10. Health check
sleep 3
HTTP_CODE=$(curl -sk -o /dev/null -w "%{http_code}" "https://${APP_DOMAIN:-beta.cavendral.com}/health" || echo "000")
if [[ "${HTTP_CODE}" != "200" ]]; then
    echo "ERRO: health check falhou (${HTTP_CODE}). Rollback..."
    PREV=$(ls -1t "${RELEASES_DIR}" | sed -n 2p)
    if [[ -n "${PREV}" ]]; then
        ln -sfn "${RELEASES_DIR}/${PREV}" "${APP_DIR}"
        systemctl reload apache2 || systemctl reload httpd || true
        echo "Rollback para release ${PREV} concluído."
    fi
    exit 1
fi

echo "==> Deploy OK. Release: ${RELEASE_DIR}"
echo "Para rollback: ln -sfn ${RELEASES_DIR}/<previous> ${APP_DIR} && systemctl reload apache2"
