#!/bin/sh
#
# Sobe o ambiente de desenvolvimento do zero.
# Uso:  sh scripts/setup-dev.sh
set -e

cd "$(dirname "$0")/.."

echo "==> 1/6  Arquivo .env"
if [ -f .env ]; then
    echo "    já existe, mantido."
    # O CORTE DOS PROVEDORES (D360) vem pelo COMPOSE_FILE. Um .env de antes de
    # 05/10/2026 não o tem, e a máquina segue falando com Asaas e WhatsApp.
    # Avisa, e não acrescenta: o mesmo .env, num servidor, não é deste roteiro.
    if ! grep -q '^COMPOSE_FILE=.*docker-compose\.desenvolvimento\.yml' .env; then
        echo "    ATENÇÃO: este .env não carrega o docker-compose.desenvolvimento.yml."
        echo "    Copie as duas linhas COMPOSE_ do .env.example antes de seguir (D360)."
    fi
else
    cp .env.example .env
    echo "    criado a partir de .env.example."
fi

echo "==> 2/6  config/autoload/local.php"
if [ -f config/autoload/local.php ]; then
    if grep -q "'host' => 'mysql'" config/autoload/local.php; then
        echo "    já aponta para o Docker, mantido."
    else
        # Proteção contra o pior cenário: um local.php com credenciais de
        # produção ficar valendo dentro do container de desenvolvimento.
        BACKUP="config/autoload/local.php.backup-$(date +%Y%m%d%H%M%S)"
        cp config/autoload/local.php "$BACKUP"
        cp docker/config/local.php.docker config/autoload/local.php
        echo "    ATENÇÃO: o local.php existente NÃO era o do Docker."
        echo "    Backup em $BACKUP e substituído pela configuração de desenvolvimento."
    fi
else
    cp docker/config/local.php.docker config/autoload/local.php
    echo "    criado a partir de docker/config/local.php.docker."
fi

echo "==> 3/6  Subindo os containers (a primeira vez compila a imagem PHP)"
docker compose up -d --build

echo "==> 4/6  Instalando dependências do Composer"
docker compose exec -T app composer install --no-interaction --prefer-dist

echo "==> 5/6  Cenário de teste"
# Cenário determinístico usado pelas duas suítes. Os ids começam em 1000 para
# não colidir com um dump anonimizado carregado no mesmo banco.
#
# ESTE PASSO ERA SURDO ATÉ 07/09/2026: `2>/dev/null || true` engolia TUDO, e a
# razão de estar ali era boa -- reaplicar as fixtures por cima de si mesmas
# colide em chave primária, e `setup-dev.sh` foi feito para poder rodar de novo.
# Mas o preço era não saber a diferença entre "já estavam lá" e "quebrou na
# metade por chave estrangeira", que é a distinção que importa.
#
# Agora ele PERGUNTA antes: se a unidade 90001000 existe, o cenário já foi
# aplicado e o passo se anuncia pulado. Se não existe, carrega -- e falha alto
# se o mysql reclamar. É o mesmo conserto que `montar-banco-contrato.sh` levou
# em 03/09, pela mesma razão: um carregador que não sabe falhar é pior que
# nenhum.
BANCO_DEV="${MYSQL_DATABASE:-franquiabv_dev}"

JA_TEM=$(docker compose exec -T mysql sh -c \
    "mysql -uroot -proot -N -e \"SELECT COUNT(*) FROM ${BANCO_DEV}.unidades WHERE id = 90001000\"" 2>/dev/null \
    | grep -v "Using a password" | tr -dc '0-9')

if [ "${JA_TEM:-0}" -gt 0 ]; then
    echo "    já aplicado neste banco, mantido."
    echo "    (o cenário pode ter ENVELHECIDO: a suíte avisa se envelheceu.)"
else
    SAIDA=$(docker compose exec -T mysql sh -c "mysql -uroot -proot ${BANCO_DEV}" \
        < tests/Caracterizacao/fixtures.sql 2>&1 | grep -v "Using a password" || true)

    if printf '%s' "$SAIDA" | grep -qi "ERROR"; then
        echo "    FALHOU ao carregar as fixtures:" >&2
        printf '%s\n' "$SAIDA" >&2
        exit 1
    fi

    echo "    carregado."
fi

echo "==> 6/6  Diretórios de escrita"
docker compose exec -T app sh -c '
    mkdir -p data/cache data/logs/agenda_json \
             public/layout/img/avatar/cache public/layout/img/avatar/tmp \
             public/arquivos public/contratos public/banners public/assistentes public/vip-class
    chmod -R 775 data public/layout/img/avatar public/arquivos public/contratos \
                 public/banners public/assistentes public/vip-class

    # O php-fpm roda como www-data; sem o chown os diretórios ficam de root e a
    # aplicação não consegue gravar log nem receber upload. Aparecia como
    # "Permission denied" no meio da resposta JSON da API do aplicativo.
    chown -R www-data:www-data data public/layout/img/avatar public/arquivos \
                               public/contratos public/banners public/assistentes \
                               public/vip-class
'

cat <<'FIM'

Ambiente pronto.

  Sistema ........ http://localhost:8080
  E-mails ........ http://localhost:8025   (Mailpit — nada sai para o mundo real)
  Banco (web) .... http://localhost:8081   (Adminer — servidor: mysql)
  Banco (cliente)  127.0.0.1:3307

O banco sobe apenas com o schema (mysql.sql não contém dados). Para trabalhar
com dados, carregue um dump ANONIMIZADO — ver scripts/anonimizar.sh e
docs/ambiente-desenvolvimento.md. Nunca use dump cru de produção.
FIM
