#!/usr/bin/env bash
#
# tools/mutation.sh — observabilidade de mutation testing (ADR-039, etapa 1).
#
# Roda Infection no escopo `src/core` + `src/services` (config `tools/infection.json5`), publica MSI em
# `build/mutation/` e **não bloqueia** o fluxo: o `make check` não chama este script. A etapa 2
# (piso de MSI como gate) entra depois de o número estabilizar com o dono.
#
# `LOG_JSON_STREAM=/dev/null` é obrigatório: o InitialTestsRunner do Infection interrompe o
# processo no primeiro byte de stderr, e o log estruturado da aplicação usa stderr (ADR-024).
# O canal diário continua funcionando; só a cópia JSON é silenciada na execução dos mutantes.
#
# Env:
#   MUTATION_THREADS=auto       threads do Infection
#   MUTATION_SHOW=20            mutantes escapados exibidos
#   MUTATION_SKIP_PREP=1        não recria/migra o banco de teste (CI/preparado)
set -Eeuo pipefail

ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$ROOT"

BASE_DB="${TEST_DB:-concordia_test}"
DB_USER="${DB_USERNAME:-concordia}"
PROJECT="$(bash "$ROOT/tools/project-name.sh" 2>/dev/null)"
# shellcheck source=tools/runtime.sh
. "$ROOT/tools/runtime.sh"
COMPOSE=("${ENGINE[@]}" compose -p "$PROJECT" --env-file .env "${COMPOSE_FILES[@]}")

psql() {
    local database="$1" sql="$2"
    "${COMPOSE[@]}" exec -T postgres psql -U "$DB_USER" -d "$database" -v ON_ERROR_STOP=1 -c "$sql"
}

if [ "${MUTATION_SKIP_PREP:-0}" != "1" ]; then
    bash "$ROOT/tools/test-db.sh" "$BASE_DB" >/dev/null

    # Mesmo reset do CoreTestCase: `migrate:fresh` não derruba os schemas de domínio.
    psql "$BASE_DB" "DO \$\$
        DECLARE s text;
        BEGIN
            FOR s IN
                SELECT nspname FROM pg_namespace
                WHERE nspname NOT IN ('pg_catalog', 'information_schema', 'public', 'pg_toast')
                  AND nspname NOT LIKE 'pg_temp%'
                  AND nspname NOT LIKE 'pg_toast_temp%'
            LOOP
                EXECUTE format('DROP SCHEMA %I CASCADE', s);
            END LOOP;
        END
    \$\$;" >/dev/null

    "${COMPOSE[@]}" exec -T -e DB_DATABASE="$BASE_DB" php-fpm php artisan migrate:fresh --force >/dev/null
fi

mkdir -p build/mutation

"${COMPOSE[@]}" exec -T -e LOG_JSON_STREAM=/dev/null php-fpm \
    ./vendor/bin/infection \
    --configuration=tools/infection.json5 \
    --threads="${MUTATION_THREADS:-auto}" \
    --show-mutations="${MUTATION_SHOW:-20}" \
    --only-covering-test-cases \
    --no-interaction \
    "$@"
