#!/usr/bin/env bash
#
# Deploy remoto — Sucesu V2
# Executado via `ssh host 'bash -s' < ci/deploy.sh` a partir do GitLab CI.
# Variaveis de ambiente (definidas pelo CI):
#   DEPLOY_DIR     diretorio do repo no servidor
#   DEPLOY_BRANCH  branch alvo (master = homolog, producao = producao)
# O vendor/ eh commitado, logo NAO ha composer install.
# Ambiente bare-metal: NAO ha Docker. Exige php, composer, git, pg_dump,
# pg_restore e zip instalados no servidor, mais um .env valido.
#
set -euo pipefail

trap 'echo "ERRO: deploy.sh falhou na linha $LINENO (comando: ${BASH_COMMAND})"' ERR

require_bins() {
    local missing=0
    for b in php composer git pg_dump pg_restore zip; do
        if ! command -v "$b" >/dev/null 2>&1; then
            echo "ERRO: binario '$b' ausente no servidor de deploy"
            missing=1
        fi
    done
    [[ "$missing" -eq 0 ]] || exit 1
}

require_env() {
    [[ -f .env ]] || { echo "ERRO: .env ausente em ${DEPLOY_DIR}"; exit 1; }
    for v in DB_DATABASE DB_USERNAME DB_PASSWORD; do
        grep -q "^${v}=" .env || { echo "ERRO: variavel ${v} ausente no .env"; exit 1; }
    done
}

require_git() {
    git rev-parse --is-inside-work-tree >/dev/null 2>&1 || {
        echo "ERRO: ${DEPLOY_DIR} nao e um repositorio git (clone o repo do GitLab aqui)"
        exit 1
    }
    git remote get-url origin >/dev/null 2>&1 || {
        echo "ERRO: remote 'origin' ausente em ${DEPLOY_DIR} (git remote add origin <url-ssh-do-gitlab>)"
        exit 1
    }
    echo "  [0/5] repo git OK (origin=$(git remote get-url origin))"
    echo "  [0/5] verificando acesso ao GitLab (git fetch)..."
    if ! git fetch origin >/dev/null 2>&1; then
        echo "ERRO: 'git fetch origin' falhou em ${DEPLOY_DIR}."
        echo "      Causa comum: o servidor nao tem chave/deploy key para o GitLab,"
        echo "      ou o 'origin' e HTTPS sem credenciais. Use SSH:"
        echo "        git remote set-url origin git@git.pbsoft.com.br:mini-projects/sucesu-cms.git"
        echo "      e adicione a chave publica do servidor como Deploy Key no GitLab."
        exit 1
    fi
    echo "  [0/5] acesso ao GitLab OK"
}

health_check() {
    local url
    url="$(grep '^APP_URL=' .env 2>/dev/null | tail -1 | cut -d= -f2- | tr -d '"' || true)"
    url="${url:-http://localhost}"
    if command -v curl >/dev/null 2>&1; then
        if curl -fsS -o /dev/null "$url/" 2>/dev/null; then
            echo "  [5/5] Health-check OK ($url)"
        else
            echo "  AVISO: health-check falhou ($url) — verifique os logs do portal"
        fi
    else
        echo "  [5/5] Health-check pulado (curl ausente no servidor)"
    fi
}

cd "$DEPLOY_DIR"

CURRENT=$(git rev-parse --abbrev-ref HEAD)
if [ "$CURRENT" != "$DEPLOY_BRANCH" ]; then
  git checkout "$DEPLOY_BRANCH"
fi

echo "  [0/5] Pre-flight (binarios + git + .env)..."
require_bins
require_git
require_env

git config core.fileMode false
OLD=$(git rev-parse HEAD)
git fetch -q origin
git reset -q --hard "origin/$DEPLOY_BRANCH"
NEW=$(git rev-parse HEAD)

if [ "$OLD" = "$NEW" ]; then
  echo "  [2/5] Sem mudancas de codigo."
else
  echo "  [2/5] Codigo atualizado:"
  git log --oneline "$OLD..$NEW" | sed 's/^/         /'
fi

echo "  [3/5] Backup pre-deploy (DB + storage)..."
bash ci/backup.sh

echo "  [3.5/5] Regenerando autoloader Composer (vendor commitado sem autoload_static.php)..."
composer dump-autoload --optimize --classmap-authoritative

echo "  [4/5] Migracoes..."
if [ "$DEPLOY_BRANCH" = "producao" ]; then
  php artisan down --retry=60 --refresh=5 || true
  trap 'php artisan up || true' EXIT
fi
php artisan migrate --force
php artisan package:discover --ansi >/dev/null 2>&1 || true
php artisan storage:link >/dev/null 2>&1 || true

echo "  [5/5] Otimizacao (prod-optimize)..."
composer prod-optimize

php artisan up >/dev/null 2>&1 || true
health_check
