#!/usr/bin/env bash
#
# Roda a caracterizacao contra o POSTGRESQL, com as fixtures.
#
#     sh scripts/rodar-caracterizacao-postgres.sh
#
# POR QUE ISTO EXISTE. O CI roda a suite de caracterizacao so contra MySQL --
# nas duas versoes do parque, mas so MySQL. Defeito que aparece unicamente no
# PostgreSQL fica invisivel la, e depende de alguem lembrar de rodar a mao.
#
# Aconteceu duas vezes em 04/09/2026, no mesmo dia:
#
#   - `ValidacaoDeAgendamentoTest` inseria `checkin, checkout, status` como
#     `0, 0, 1`, e no PostgreSQL as tres colunas sao BOOLEANAS (D81). Quatro
#     testes verdes no MySQL, quatro vermelhos no PostgreSQL.
#
#   - antes disso, uma colisao de id entre fixtures e testes so aparecia no
#     cenario do CI (ver `rodar-caracterizacao-como-ci.sh`).
#
# E A MIGRACAO E PARA O POSTGRESQL. "Passa no MySQL" nao e a pergunta que a
# Fase 1 faz.
#
# ---------------------------------------------------------------------------
# O QUE MUDOU PARA ISTO SER POSSIVEL
#
# Ate 04/09/2026 o `fixtures.sql` nao carregava no PostgreSQL. Faltavam tres
# coisas, todas pequenas, e estao descritas no cabecalho daquele arquivo. Hoje
# ele carrega nos dois com as mesmas contagens, conferido tabela a tabela.
#
# O que este roteiro acrescenta na carga, e que NAO cabe no arquivo:
#
#   - `SET app.inquilino_id`, que o RLS exige antes de qualquer INSERT;
#   - pular o `SET NAMES utf8mb4`, que e do MySQL.
#
# ---------------------------------------------------------------------------
# ELE NAO SUBSTITUI A EXECUCAO NORMAL. Contra fixtures, os testes que dependem
# do historico da producao se declaram pulados. Rode os dois.

set -euo pipefail

BANCO="franquiabv_pgtestes"
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

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} a partir de postgres/schema.sql mais as fixtures..."

docker compose exec -T postgres psql -U franquiabv -d postgres -q \
    -c "DROP DATABASE IF EXISTS ${BANCO};" -c "CREATE DATABASE ${BANCO};" >/dev/null

docker compose exec -T postgres psql -U franquiabv -d "${BANCO}" -q -v ON_ERROR_STOP=1 -f - \
    < postgres/schema.sql >/dev/null

# A CARGA FALHA ALTO. `ON_ERROR_STOP` faz o psql parar no primeiro erro, e o
# `set -e` derruba o roteiro -- sem isso, uma fixture recusada passaria
# despercebida e a suite rodaria sobre um banco pela metade, verde e mentindo.
{
    echo "SET app.inquilino_id = 1;"
    grep -v "^SET NAMES" tests/Caracterizacao/fixtures.sql
} | docker compose exec -T postgres psql -U franquiabv -d "${BANCO}" -q -v ON_ERROR_STOP=1 -f -

# AS SEQUENCIAS PRECISAM SER AVANCADAS DEPOIS DAS FIXTURES.
#
# `fixtures.sql` grava com id explicito, e no PostgreSQL isso NAO move a
# sequencia. A primeira insercao feita pela aplicacao pede o id 1, acha o
# cliente avulso no lugar e responde 500 -- foi o que o cadastro da quarta
# fatia encontrou. O MySQL nao tem o problema: o AUTO_INCREMENT sobe
# sozinho quando alguem grava um id maior.
docker compose exec -T postgres psql -U franquiabv -d "${BANCO}" -q -v ON_ERROR_STOP=1 -f - \
    < postgres/repontar-sequencias.sql

# O `local.php` do PostgreSQL, com o banco deste roteiro.
sed -e "s/'dbname' *=> *'[a-z_]*'/'dbname' => '${BANCO}'/" \
    config/autoload/local.postgres.php.dist > "$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 "$@"
