#!/bin/sh
#
# Grava um `cron.token` SORTEADO no `local.php` dado -- para o roteiro que monta
# um `local.php` descartavel e mede as rotinas por URL.
#
#     sh scripts/sortear-token-cron.sh config/autoload/local.php
#
# Sai com 2 se nao conseguir gravar, e nunca imprime o token.
#
# ---------------------------------------------------------------------------
# POR QUE ISTO EXISTE (03/10/2026, revisao do SEGREDOS)
#
# Desde o SEGREDOS o token das rotinas sai do `cron.token` do `local.php`, e
# nao mais do `CronJobController`. O `medir-telas-no-postgres.sh` monta o
# `local.php` dele de dois jeitos -- do dist do PostgreSQL, onde o token e
# VAZIO, ou do de desenvolvimento, que nem tem a secao -- e o medidor das
# rotinas passou a sair com 2 ("NAO ACHEI O TOKEN"). Com o `set -e`, a corrida
# morria ali, sem a medicao de `/adm/api` nem a dos relatorios, que vem
# depois; e o `comparar-relatorios-nos-dois-bancos.sh`, que o chama duas vezes,
# morria na primeira.
#
# O CI tem o passo dele, com o mesmo sorteio (`ci.yml`, no job do
# PostgreSQL).
#
# ---------------------------------------------------------------------------
# COMO
#
# O `'cron'` entra no FIM do array, antes do `];`. No PHP a chave repetida fica
# com o ULTIMO valor, entao ele vence o `'cron' => ['token' => '']` do dist, e
# serve igual ao `local.php` que nao tem a secao.
#
# O `printf` com `%s` nao e capricho: escrita por extenso, a linha teria a forma
# de credencial literal, e o portao de segredos acusaria este arquivo.
#
# QUEM CHAMA DEVOLVE O `local.php` DE ANTES (o `trap` do medir-telas): o token
# so vale para a corrida.

set -eu

LOCAL="${1:-}"

if [ -z "$LOCAL" ] || [ ! -f "$LOCAL" ]; then
    echo "uso: sh scripts/sortear-token-cron.sh <local.php existente>" >&2
    exit 2
fi

if [ "$(tail -n 1 "$LOCAL" | tr -d '\r')" != "];" ]; then
    echo "a ultima linha de $LOCAL nao e o '];' do array -- nao sei onde acrescentar." >&2
    exit 2
fi

TOKEN=$(od -An -tx1 -N24 /dev/urandom | tr -d ' \n')

if [ "${#TOKEN}" -ne 48 ]; then
    echo "nao consegui sortear o token." >&2
    exit 2
fi

sed -i '$ d' "$LOCAL"
printf "    'cron' => ['token' => '%s'],\n];\n" "$TOKEN" >> "$LOCAL"

# A AFIRMACAO de que pegou: o token uma vez so, e o array fechado de novo.
if [ "$(grep -c "$TOKEN" "$LOCAL")" != "1" ] || [ "$(tail -n 1 "$LOCAL")" != "];" ]; then
    echo "o token nao entrou uma vez so em $LOCAL." >&2
    exit 2
fi

echo "cron.token sorteado e gravado em $LOCAL (so para esta corrida)."
