#!/bin/sh
#
# Sobe o front da Fase 3 com um back que da para logar.
#
#     sh scripts/rodar-front.sh
#     sh scripts/rodar-front.sh --montar    # remonta o banco de fixtures antes
#
# ---------------------------------------------------------------------------
# POR QUE ISTO EXISTE
#
# O front nao tem autenticacao propria -- ele usa a sessao do ERP, pelo proxy de
# mesma origem do `frontend/vite.config.ts`. Para entrar e preciso um usuario
# com senha conhecida, e o unico que tem e o de fixture (`gerente.teste`), que
# so existe no banco de contrato.
#
# O `franquiabv_dev` NAO SERVE, e isso e proposital: ele e a copia anonimizada
# de producao. Ninguem sabe a senha de ninguem ali -- a anonimizacao reescreveu
# os hashes --, e `definir-senha-contrato.php` RECUSA rodar contra ele, com
# razao: "este banco tem 63 unidades, nao e o de contrato".
#
# Entao desenvolver tela contra `franquiabv_contrato` nao e limitacao, e
# escolha: quatro unidades, cenario deterministico, e nenhum dado pessoal na
# tela enquanto se programa.
#
# ---------------------------------------------------------------------------
# O QUE ELE FAZ, E O QUE DESFAZ
#
# Aponta o `local.php` para o banco de fixtures, sobe o Vite, e DEVOLVE o
# `local.php` ao sair -- inclusive com Ctrl-C, que e como se para um servidor de
# desenvolvimento.
#
# Sem essa devolucao, a proxima suite de caracterizacao rodaria contra 35 linhas
# de fixture achando que le a copia de producao. Ela tem guarda propria, mas
# contar com a guarda do vizinho e como nao ter guarda.
set -eu

BANCO="franquiabv_contrato"
LOCAL="config/autoload/local.php"
FRONT="frontend"
MONTAR=""

for arg in "$@"; do
    case "$arg" in
        --montar) MONTAR="1" ;;
        *) echo "argumento desconhecido: $arg" >&2; exit 2 ;;
    esac
done

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

if [ ! -d "$FRONT/node_modules" ]; then
    echo "as dependencias do front nao estao instaladas." >&2
    echo >&2
    echo "    cd $FRONT && npm install" >&2
    exit 2
fi

# ---------------------------------------------------------------------------
# ELE NAO PODE SER ENVENENADO PELA PROPRIA FALHA ANTERIOR.
#
# Se uma execucao morreu de um jeito que o `trap` nao alcanca -- kill -9, o
# terminal fechando --, o `local.php` fica no banco de fixtures. Na vez
# seguinte o backup copiaria ESSE estado, e a "restauracao" devolveria o banco
# errado com a mensagem tranquilizadora de que restaurou.
#
# Aconteceu em 03/09/2026, com o roteiro de contrato. Este nasce sabendo.
# ---------------------------------------------------------------------------
if grep -q "'dbname' => '${BANCO}'" "$LOCAL"; then
    echo "O local.php JA APONTA para ${BANCO}." >&2
    echo >&2
    echo "  Uma execucao anterior nao restaurou o ambiente. Comecar assim" >&2
    echo "  gravaria o estado errado no backup." >&2
    echo >&2
    echo "  Aponte de volta antes:" >&2
    echo >&2
    echo "      sed -i \"s/'dbname' => '${BANCO}'/'dbname' => 'franquiabv_dev'/\" $LOCAL" >&2
    exit 2
fi

BACKUP="$(mktemp)"
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 ' ')"

    # A RESTAURACAO CONFERE A SI MESMA. Dizer "restaurado" e devolver o banco de
    # fixtures ja aconteceu neste projeto; a mensagem sozinha nao vale nada.
    if grep -q "'dbname' => '${BANCO}'" "$LOCAL"; then
        echo >&2
        echo "  ATENCAO: o local.php CONTINUA apontando para ${BANCO}." >&2
        echo "  Corrija antes de rodar qualquer suite." >&2
    fi
}
trap restaurar EXIT INT TERM

if [ -n "$MONTAR" ]; then
    sh scripts/montar-banco-contrato.sh "$BANCO"
fi

# ---------------------------------------------------------------------------
# SEM SENHA NAO DA PARA ENTRAR, e sem entrar a tela nao mostra nada.
#
# O hash e gerado na montagem e NUNCA versionado -- por decisao registrada em
# `definir-senha-contrato.php`: com uma credencial que funciona no repositorio,
# o portao de push nao tem como distinguir a de teste da de verdade.
# ---------------------------------------------------------------------------
TEM_SENHA=$(docker compose exec -T mysql mysql -N -B -uroot -proot "$BANCO" \
    -e "SELECT COUNT(*) FROM usuarios WHERE id = 90001001 AND senha LIKE '\$2y\$%';" 2>/dev/null || echo 0)

if [ "$(echo "$TEM_SENHA" | tr -d '\r')" != "1" ]; then
    echo "o usuario de fixture nao tem senha em ${BANCO}." >&2
    echo >&2
    echo "  Remonte o banco, que gera a senha na montagem:" >&2
    echo >&2
    echo "      sh scripts/rodar-front.sh --montar" >&2
    exit 2
fi

echo "=============================================================================="
echo "FRONT DA FASE 3"
echo "=============================================================================="
echo
echo "  banco:    ${BANCO}  (cenario de fixtures, 4 unidades, sem dado pessoal)"
echo "  API:      http://127.0.0.1:8080/adm/api"
echo "  tela:     http://127.0.0.1:5173"
echo
echo "  Entre com o usuario de fixture. A senha veio da montagem do banco --"
echo "  e a CONTRATO_SENHA usada por scripts/definir-senha-contrato.php."
echo
echo "      login: gerente.teste"
echo
echo "  Ctrl-C para parar. O local.php volta sozinho para franquiabv_dev."
echo

sed -i "s/'dbname' => 'franquiabv_dev'/'dbname' => '${BANCO}'/" "$LOCAL"
docker compose exec -T app sh -c 'rm -rf data/DoctrineORMModule/Proxy/*; true' >/dev/null 2>&1 || true

cd "$FRONT" && npm run dev
