#!/usr/bin/env bash
#
# Roda a caracterizacao como o CI roda: contra um banco SO DE FIXTURES.
#
#     sh scripts/rodar-caracterizacao-como-ci.sh
#
# POR QUE ISTO EXISTE. A suite de caracterizacao roda, aqui, contra o banco de
# desenvolvimento -- que tem a copia anonimizada da producao. No CI ela roda
# contra `mysql.sql` mais `tests/Caracterizacao/fixtures.sql`, e mais nada.
#
# SAO DOIS CENARIOS DIFERENTES, e um defeito que so aparece num deles nao
# aparece no outro. Em 03/09/2026 isso custou um empurrao: o cenario novo das
# fixtures passou a criar uma venda com id 90001200, e `AutorizacaoFiadoTest`
# cria a venda DELE com esse mesmo id. Localmente as fixtures nao estao
# carregadas, entao nao havia colisao; no CI havia, e certa.
#
# Este roteiro monta o mesmo banco que o CI monta e roda a suite contra ele,
# com a declaracao `CARACTERIZACAO_SEM_COPIA` que aquele ambiente usa.
#
# ELE NAO SUBSTITUI A EXECUCAO NORMAL. Contra as fixtures, os testes que
# dependem do historico da producao se declaram pulados -- e sao justamente os
# que a execucao normal cobre. Rode os dois.

set -euo pipefail

BANCO="franquiabv_cilocal"
LOCAL="config/autoload/local.php"
BACKUP="$(mktemp)"

if [ ! -f "$LOCAL" ]; then
    echo "nao achei $LOCAL -- rode a partir da raiz do projeto." >&2
    exit 2
fi

# A MESMA GUARDA DO `rodar-contrato.sh`, pelo mesmo motivo: comecar com o
# local.php ja apontado para um banco de teste faz o backup gravar o estado
# errado, e a "restauracao" devolve o banco errado dizendo que restaurou.
if grep -q "'dbname' => '${BANCO}'" "$LOCAL"; then
    echo "O local.php JA APONTA para ${BANCO}." >&2
    echo "  Uma execucao anterior nao restaurou o ambiente. Aponte-o de volta antes." >&2
    exit 2
fi

cp "$LOCAL" "$BACKUP"

restaurar() {
    cp "$BACKUP" "$LOCAL"
    rm -f "$BACKUP"
    docker compose exec -T app sh -c 'rm -rf data/DoctrineORMModule/Proxy/* data/cache/*; true' >/dev/null 2>&1 || true
    echo
    echo "ambiente restaurado: $(grep -m1 dbname "$LOCAL" | tr -d ' ')"

    if grep -q "'dbname' => '${BANCO}'" "$LOCAL"; then
        echo "  ATENCAO: o local.php CONTINUA apontando para ${BANCO}." >&2
    fi
}
trap restaurar EXIT INT TERM

echo "montando ${BANCO} do jeito que o CI monta..."

docker compose exec -T mysql sh -c \
    "mysql -uroot -proot -e \"DROP DATABASE IF EXISTS ${BANCO}; CREATE DATABASE ${BANCO} CHARACTER SET utf8mb4; GRANT ALL ON ${BANCO}.* TO 'franquiabv'@'%'; FLUSH PRIVILEGES;\"" \
    2>&1 | grep -v "Using a password" || true

grep -v "GTID_PURGED" mysql.sql \
    | docker compose exec -T mysql sh -c "mysql -uroot -proot ${BANCO}" \
    2>&1 | grep -v "Using a password" || true

docker compose exec -T mysql sh -c "mysql -uroot -proot ${BANCO}" \
    < tests/Caracterizacao/fixtures.sql \
    2>&1 | grep -v "Using a password" || true

sed -i "s/'dbname' => '[a-z_]*'/'dbname' => '${BANCO}'/" "$LOCAL"
docker compose exec -T app sh -c 'rm -rf data/DoctrineORMModule/Proxy/* data/cache/*; true'

echo
echo "rodando a caracterizacao contra ${BANCO}..."
echo

# O QUE VIER DEPOIS DO ROTEIRO VAI PARA O PHPUNIT: `--filter Remarc` roda so os
# casos de um assunto, no mesmo banco montado. Sem nada, a suite inteira.
docker compose exec -T -e CARACTERIZACAO_SEM_COPIA=1 app phpunit --testsuite caracterizacao "$@"
