#!/usr/bin/env bash
# 01-identity — nome único do projeto/imagem, diretórios de dados e marcador de posse.
set -Eeuo pipefail
# shellcheck source=../lib/common.sh
. "$(dirname "$0")/../lib/common.sh"

phase_begin "01-identity"

project_resolve
refuse_legacy_stack
project_collision
port_collision

existing="$(docker ps -a --filter "label=com.docker.compose.project=${PROJECT_NAME}" --format '{{.Names}}' | head -1 || true)"
if [ -n "$existing" ]; then
    warn "a estrutura '${PROJECT_NAME}' já possui containers (${existing}); init é idempotente e NÃO faz backup. Para atualizar use scripts/update_prod.sh."
fi

# Nome único: grava no .env para que TODOS os pontos de entrada (make, tools, compose) usem
# o mesmo namespace — não só os destes scripts.
if env_has COMPOSE_PROJECT_NAME; then
    pinned="$(env_value COMPOSE_PROJECT_NAME)"
    [ "$pinned" = "$PROJECT_NAME" ] ||
        die "COMPOSE_PROJECT_NAME no .env ('${pinned}') diverge do resolvido ('${PROJECT_NAME}')."
    log "COMPOSE_PROJECT_NAME já fixado: ${PROJECT_NAME}"
else
    env_set COMPOSE_PROJECT_NAME "$PROJECT_NAME"
fi

# Imagem POR PROJETO: a tag `concordia/php-fpm:local` era compartilhada entre instalações;
# um build de um cliente trocava a imagem que o outro usaria no próximo recreate.
current_image="$(env_value PHP_IMAGE)"
case "$current_image" in
    '' | concordia/php-fpm)
        env_set PHP_IMAGE "$PHP_IMAGE"
        ;;
    *)
        if [ "$current_image" != "$PHP_IMAGE" ]; then
            warn "PHP_IMAGE explícito no .env ('${current_image}') — usando-o (não é a tag compartilhada)."
        fi
        ;;
esac

if [ "$DRY_RUN" = 0 ]; then
    chmod 600 "$ENV_FILE"
fi

# Diretórios de runtime (o guard do git é recriado pelo helper; nunca versionado).
run bash "$ROOT/tools/data-dirs.sh" "$DATA_PATH_V" "$STORAGE_PATH_V"
ensure_dir "$ROOT/bootstrap/cache"
for d in app/public app/private framework/cache/data framework/sessions framework/views framework/php-env logs; do
    ensure_dir "$STORAGE_ABS/$d"
done

# Marcador de posse do DATA_PATH: impede que dois checkouts (ex.: .env copiado) apontem para
# o mesmo PGDATA. Um PGDATA sem marcador é de uma instalação anterior — não é inicialização.
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
fi
if [ ! -f "$MARKER" ] && [ -f "$DATA_ABS/pgdata/PG_VERSION" ]; then
    die "PGDATA já existe em ${DATA_ABS}/pgdata sem marcador de inicialização. Use scripts/update_prod.sh (adoção)."
fi
write_owner_marker

log "dados   : ${DATA_ABS} (PGDATA, RustFS)"
log "storage : ${STORAGE_ABS} (logs, framework, backups)"
log "marcador: ${MARKER}"

phase_end
