#!/usr/bin/env bash
#
# Wrapper de TESTE (dev) do cron Dashboard Expedicao.
#
# Diferenças vs run_dashboard_expedicao.sh:
#   - Roda contra dev (CRON_HOST=dev-* + --ambiente-dev).
#   - SEM --com-enriquecimento (não chama Google API).
#   - Schedule fixo: a cada 5 minutos (*/5 * * * *).
#   - Auto-uninstall depois de 3 execuções (contador em /tmp).
#   - Log separado: dashboard_expedicao_test_*.log (não polui o log de prod).
#
# Uso:
#   ./run_dashboard_expedicao_test.sh install      # registra + zera contador
#   ./run_dashboard_expedicao_test.sh status       # contador + schedule + últimos logs
#   ./run_dashboard_expedicao_test.sh tail         # tail -f no log do dia
#   ./run_dashboard_expedicao_test.sh uninstall    # remove manualmente
#   ./run_dashboard_expedicao_test.sh run          # 1 ciclo (usado pelo crontab)

set -uo pipefail

# ====== CONFIG (ajustar se o host dev for diferente) ======
GENESIS_ROOT="/home/goldie/www/genesis"
DEV_CRON_HOST="dev-genesis.goldieapp.com.br"
PHP_BIN="/usr/bin/php"
TEST_SCHEDULE="*/5 * * * *"
MAX_RUNS=3
# ==========================================================

SCRIPT_PATH="$(readlink -f "$0")"
LOG_DIR="${GENESIS_ROOT}/logs"
COUNTER_FILE="/tmp/dashboard_expedicao_test_runs.count"
LOCK_FILE="/tmp/dashboard_expedicao_test.lock"
CRONTAB_TAG="# dashboard_expedicao_cron_test_v1"

usage() {
    cat <<EOF
Uso: $0 [install | status | tail | uninstall | run]

  install     Registra no crontab (*/5 * * * *) e zera o contador.
              Auto-uninstall depois de ${MAX_RUNS} execuções.
  status      Mostra contador, schedule e últimos logs de teste.
  tail        tail -f no log de teste do dia (Ctrl+C para sair).
  uninstall   Remove do crontab manualmente (sem esperar ${MAX_RUNS} runs).
  run         Executa 1 ciclo (default — chamado pelo crontab).
EOF
}

read_crontab() {
    crontab -l 2>/dev/null || true
}

remove_from_crontab() {
    {
        read_crontab \
            | grep -v -F "${CRONTAB_TAG}" 2>/dev/null \
            | grep -v -F "${SCRIPT_PATH}" 2>/dev/null \
            || true
    } | crontab -
}

cmd_install() {
    local cron_line="${TEST_SCHEDULE} ${SCRIPT_PATH} run ${CRONTAB_TAG}"

    chmod +x "${SCRIPT_PATH}"
    echo 0 > "${COUNTER_FILE}"

    {
        read_crontab \
            | grep -v -F "${CRONTAB_TAG}" 2>/dev/null \
            | grep -v -F "${SCRIPT_PATH}" 2>/dev/null \
            || true
        echo "${cron_line}"
    } | crontab -

    echo "[OK] cron de TESTE registrado:"
    echo "    ${cron_line}"
    echo ""
    echo "Vai rodar ${MAX_RUNS}x a cada 5 min e depois se auto-remove."
    echo "DB: dev (host=${DEV_CRON_HOST}) — sem chamadas Google."
    echo ""
    echo "Acompanhe:"
    echo "  $0 status   # contador + último resultado"
    echo "  $0 tail     # log em tempo real"
}

cmd_uninstall() {
    remove_from_crontab
    rm -f "${COUNTER_FILE}"
    echo "[OK] cron de teste removido."
}

cmd_status() {
    local counter=0
    [[ -f "${COUNTER_FILE}" ]] && counter=$(cat "${COUNTER_FILE}")

    echo "── Contador ────────────────────────────"
    echo "  Execuções: ${counter}/${MAX_RUNS}"
    if [[ "${counter}" -ge "${MAX_RUNS}" ]]; then
        echo "  (limite atingido — cron já foi auto-removido)"
    fi
    echo ""

    echo "── Crontab ─────────────────────────────"
    if read_crontab | grep -F "${CRONTAB_TAG}" >/dev/null 2>&1; then
        read_crontab | grep -F "${CRONTAB_TAG}"
    else
        echo "  (não agendado)"
    fi
    echo ""

    echo "── Últimos logs de teste ───────────────"
    if [[ -d "${LOG_DIR}" ]]; then
        # shellcheck disable=SC2012
        local logs
        logs=$(ls -1t "${LOG_DIR}"/dashboard_expedicao_test_????-??-??.log 2>/dev/null | head -5)
        if [[ -n "${logs}" ]]; then
            echo "${logs}" | while IFS= read -r f; do
                echo "  $(basename "$f"):"
                grep -E 'TEST run|finalizado' "$f" | tail -6 | sed 's/^/    /'
            done
        else
            echo "  (nenhum log de teste ainda — primeira execução em até 5 min)"
        fi
    else
        echo "  (sem diretório de logs em ${LOG_DIR})"
    fi
}

cmd_tail() {
    local log_file="${LOG_DIR}/dashboard_expedicao_test_$(date +%Y-%m-%d).log"
    if [[ ! -f "${log_file}" ]]; then
        echo "Sem log do dia ainda em: ${log_file}"
        echo "A primeira execução leva até 5 min. Tente de novo daqui a pouco."
        exit 0
    fi
    echo "tail -f ${log_file}  (Ctrl+C para sair)"
    echo ""
    tail -f "${log_file}"
}

cmd_run() {
    mkdir -p "${LOG_DIR}"
    local log_file="${LOG_DIR}/dashboard_expedicao_test_$(date +%Y-%m-%d).log"

    exec >> "${log_file}" 2>&1

    # Incrementa contador antes de rodar (assim falha conta como execução também)
    local counter=0
    [[ -f "${COUNTER_FILE}" ]] && counter=$(cat "${COUNTER_FILE}")
    counter=$((counter + 1))
    echo "${counter}" > "${COUNTER_FILE}"

    echo ""
    echo "==================================================================="
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] TEST run ${counter}/${MAX_RUNS} (host=${DEV_CRON_HOST}, SEM Google)"
    echo "==================================================================="

    (
        flock -n 9 || {
            echo "[$(date '+%Y-%m-%d %H:%M:%S')] ABORTADO: lock ocupado por outro processo"
            exit 99
        }

        cd "${GENESIS_ROOT}" || { echo "ERRO: GENESIS_ROOT inacessível: ${GENESIS_ROOT}"; exit 2; }
        export CRON_HOST="${DEV_CRON_HOST}"

        # SEM --com-enriquecimento → não chama Google
        # COM --ambiente-dev → permite executar mesmo com host dev-*
        "${PHP_BIN}" crons/dashboard_expedicao_diario.php \
            --ambiente-dev
    ) 9>"${LOCK_FILE}"
    local rc=$?

    echo ""
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] TEST run ${counter}/${MAX_RUNS} finalizado (exit=${rc})"

    # Auto-uninstall depois de MAX_RUNS execuções
    if [[ "${counter}" -ge "${MAX_RUNS}" ]]; then
        echo ""
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] === LIMITE DE ${MAX_RUNS} EXECUÇÕES ATINGIDO ==="
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] Auto-removendo do crontab..."
        remove_from_crontab
        rm -f "${COUNTER_FILE}"
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] [OK] teste concluído — cron desagendado."
    fi

    exit "${rc}"
}

case "${1:-run}" in
    install)   cmd_install ;;
    uninstall) cmd_uninstall ;;
    status)    cmd_status ;;
    tail)      cmd_tail ;;
    run|"")    cmd_run ;;
    -h|--help) usage ;;
    *)         echo "Comando desconhecido: $1" >&2; usage >&2; exit 2 ;;
esac
