#!/usr/bin/env bash
# 00-preflight — valida ambiente/estado de uma instalação EXISTENTE. Somente leitura.
set -Eeuo pipefail
# shellcheck source=../lib/common.sh
. "$(dirname "$0")/../lib/common.sh"

phase_begin "00-preflight"

require_tools
validate_env update
check_dirty
disk_check
project_collision
port_collision

"${COMPOSE[@]}" config -q >/dev/null || die "configuração do docker-compose.yml inválida para este .env"

legacy="$(checkout_stacks)"
if [ -n "$legacy" ] && [ "$ADOPT" = 0 ]; then
    die "há stack antiga deste checkout (${legacy//$'\n'/, }) além da stack nova. Remova a antiga ou deixe só uma para o update adotar."
fi
[ -n "$STACK_PROJECT" ] ||
    die "a estrutura não está inicializada (nem stack nova, nem stack anterior adotável). Rode scripts/init_prod.sh."

containers="$(docker ps -a --filter "label=com.docker.compose.project=${STACK_PROJECT}" --format '{{.Names}}' | head -1 || true)"
[ -n "$containers" ] ||
    die "a stack '${STACK_PROJECT}' não tem containers. Rode scripts/init_prod.sh."

if [ "$ADOPT" = 1 ]; then
    log "adoção: stack anterior '${STACK_PROJECT}' deste checkout será adotada (backup → PGDATA → down → up no projeto novo)"
fi

MARKER="$DATA_ABS/.concordia-owner"
if [ -f "$MARKER" ]; then
    owner="$(sed -n 's/^checkout=//p' "$MARKER" | head -1)"
    if [ -n "$owner" ] && [ "$owner" != "$ROOT" ]; then
        die "DATA_PATH ${DATA_ABS} pertence a outro checkout (${owner}); nada é compartilhado (ADR-055)."
    fi
    [ -d "$DATA_ABS/pgdata" ] || die "DATA_PATH ${DATA_ABS} sem pgdata; a estrutura está incompleta."
elif [ -f "$DATA_ABS/pgdata/PG_VERSION" ]; then
    warn "DATA_PATH sem marcador de posse (instalação anterior); o backup ainda será feito antes de qualquer mudança."
fi

# O backup do storage só é possível se a origem puder ser copiada: RustFS local (tar) ou
# um offsite configurado (media:backup). Storage externo sem offsite = NÃO atualizar.
case "$AWS_ENDPOINT_V" in
    *storage:9000* | *//localhost* | *127.0.0.1*)
        log "storage local (RustFS): snapshot por tar + media:backup quando configurado"
        ;;
    *)
        if [ -z "$OFFSITE_MEDIA_BUCKET_V" ]; then
            die "AWS_ENDPOINT externo ('${AWS_ENDPOINT_V}') sem OFFSITE_MEDIA_BUCKET: não há como provar o backup do storage. Configure o bucket offsite antes de atualizar."
        fi
        ;;
esac

perms="$(stat -c '%a' "$ENV_FILE" 2>/dev/null || printf '?')"
case "$perms" in
    600 | 400) ;;
    *) warn ".env com modo ${perms} (recomendado 600)." ;;
esac

log "projeto Compose: ${PROJECT_NAME} (stack viva: ${STACK_PROJECT}$([ "$ADOPT" = 1 ] && printf ' — adoção' || true))"
log "imagem php-fpm : ${PHP_IMAGE}:${PHP_TAG}"
log "porta          : 127.0.0.1:${WEB_PORT}"
log "commit atual   : $(git_commit)"
log "git            : $([ "$NO_PULL" = 1 ] && printf 'pull desabilitado (--no-pull)' || printf 'pull --ff-only habilitado')"
log "docker         : $(docker --version | cut -d, -f1) · compose $(docker compose version --short)"
log "chamada        : $([ "$DRY_RUN" = 1 ] && printf 'DRY-RUN (nenhuma mutação)' || printf 'EXECUÇÃO')"

phase_end
