#!/usr/bin/env sh
#
# tools/project-name.sh — resolve o nome do projeto Docker Compose de forma SEGURA e ÚNICA.
#
# Fonte (ordem): $COMPOSE_PROJECT_NAME → `.env` (COMPOSE_PROJECT_NAME) → APP_NAME → `publicv7`.
# O slug do APP_NAME é a identidade do **produto** ("Concordia"); dois clientes no mesmo host
# usam o mesmo APP_NAME e, por isso, o nome derivado recebe um discriminador da **instalação**
# (8 hex do caminho físico do checkout). Resultado: namespaces de containers, redes e volumes
# nunca colidem entre instâncias (ADR-055).
#
#   "Prefeitura de Santa Barra" → prefeitura-santa-barra-6d83ae07
#   "Concordia"                → concordia-6d83ae07
#
# Um `COMPOSE_PROJECT_NAME` explícito (ambiente ou `.env`) vence e **não** recebe o sufixo —
# é a saída para migrar/pinar uma instalação. Sempre devolve um nome válido para o Compose:
# `[a-z0-9][a-z0-9_-]*`. Espaços/acentos/símbolos viram `-`; conectivos PT são removidos.
# Se o slug mudar, avisa em stderr (nunca usa valor inválido).
#
# Uso: PROJECT_NAME="$(tools/project-name.sh)"
set -eu

ROOT="$(cd "$(dirname "$0")/.." && pwd)"

env_value() {
    [ -f "$ROOT/.env" ] || return 0
    grep -E "^$1=" "$ROOT/.env" | head -1 | cut -d= -f2- \
        | sed -E 's/^"(.*)"$/\1/; s/^'"'"'(.*)'"'"'$/\1/' || true
}

explicit="${COMPOSE_PROJECT_NAME:-}"
[ -n "$explicit" ] || explicit="$(env_value COMPOSE_PROJECT_NAME)"

if [ -n "$explicit" ]; then
    raw="$explicit"
    derived=0
else
    raw="$(env_value APP_NAME)"
    [ -n "$raw" ] || raw="publicv7"
    derived=1
fi

# Translitera acentos (São → Sao) quando `iconv` existir.
raw_ascii="$(printf '%s' "$raw" | iconv -f UTF-8 -t ASCII//TRANSLIT 2>/dev/null || printf '%s' "$raw")"

# Normaliza: minúsculas; [^a-z0-9_-] → '-'; sem '-' nas pontas; sem repetidos.
normalized="$(printf '%s' "$raw_ascii" \
    | tr '[:upper:]' '[:lower:]' \
    | sed -E 's/[^a-z0-9_-]+/-/g; s/^-+//; s/-+$//; s/-{2,}/-/g')"

# Remove conectivos PT ("Prefeitura de Santa Barra" → "prefeitura-santa-barra").
name="$(printf '%s' "$normalized" | awk -F- '{
    out = "";
    for (i = 1; i <= NF; i++) {
        if ($i == "" || $i ~ /^(a|o|as|os|de|da|do|das|dos|e|em|no|na|nos|nas)$/) continue;
        out = (out == "" ? $i : out "-" $i);
    }
    print out;
}')"

# Compose exige começar com [a-z0-9].
case "$name" in
    [a-z0-9]*) : ;;
    *) name="p-${name}" ;;
esac

[ -n "$name" ] || name="publicv7"

if [ "$name" != "$raw" ]; then
    printf '[project-name] "%s" normalizado para "%s"\n' "$raw" "$name" >&2
fi

# Discriminador da instalação: o caminho FÍSICO do checkout (symlinks resolvidos). Estável
# enquanto o checkout não se move; dois checkouts no mesmo host nunca coincidem.
if [ "$derived" = 1 ]; then
    installation="$(cd "$ROOT" && pwd -P)"
    hash="$(printf '%s' "$installation" | sha256sum | cut -c1-8)"
    name="${name}-${hash}"
fi

printf '%s\n' "$name"
