#!/usr/bin/env bash
#
# Wrapper + auto-instalador do cron diário do Dashboard Expedicao.
#
# Comandos:
#   ./run_dashboard_expedicao.sh install               # registra no crontab (default: 0 3 * * *)
#   ./run_dashboard_expedicao.sh install "30 4 * * *"  # com schedule customizado
#   ./run_dashboard_expedicao.sh uninstall             # remove do crontab
#   ./run_dashboard_expedicao.sh status                # mostra agendamento + últimos logs
#   ./run_dashboard_expedicao.sh run                   # executa agora (usado pelo crontab)
#   ./run_dashboard_expedicao.sh                       # idem run (default)
#
# install é idempotente: re-instalar substitui a linha anterior em vez de duplicar.

set -uo pipefail

# ====== CONFIG (ajustar por servidor) ======
GENESIS_ROOT="/home/goldie/www/genesis"
CRON_HOST="genesis.goldieapp.com.br"
PHP_BIN="/usr/bin/php"
MAX_GOOGLE_CALLS=1000
LOG_RETENTION_DAYS=30
DEFAULT_SCHEDULE="0 3 * * *"
# ===========================================

SCRIPT_PATH="$(readlink -f "$0")"
LOCK_FILE="/tmp/dashboard_expedicao_diario.lock"
LOG_DIR="${GENESIS_ROOT}/logs"

# Tag usada para localizar a linha do script no crontab (install/uninstall idempotente)
CRONTAB_TAG="# dashboard_expedicao_cron_v1"

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

  install [schedule]  Registra no crontab. Schedule cron-format (default: "0 3 * * *").
                      Idempotente: re-instalar substitui a linha anterior.
  uninstall           Remove a linha deste script do crontab.
  status              Mostra se está agendado e resumo dos últimos logs.
  run                 Executa o cron agora (modo padrão chamado pelo crontab).

Exemplos:
  $0 install
  $0 install "30 4 * * *"
  $0 status
EOF
}

# Lê crontab tolerando "no crontab for <user>"
read_crontab() {
    crontab -l 2>/dev/null || true
}

cmd_install() {
    local schedule="${1:-$DEFAULT_SCHEDULE}"
    local cron_line="${schedule} ${SCRIPT_PATH} run ${CRONTAB_TAG}"

    # Sanity check do formato cron (5 campos)
    local field_count
    field_count=$(echo "${schedule}" | awk '{print NF}')
    if [[ "${field_count}" -ne 5 ]]; then
        echo "ERRO: schedule inválido — esperado 5 campos cron (\"${schedule}\")." >&2
        exit 2
    fi

    chmod +x "${SCRIPT_PATH}"

    {
        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 registrado:"
    echo "    ${cron_line}"
    echo ""
    echo "Confirme com: crontab -l"
}

cmd_uninstall() {
    {
        read_crontab \
            | grep -v -F "${CRONTAB_TAG}" 2>/dev/null \
            | grep -v -F "${SCRIPT_PATH}" 2>/dev/null \
            || true
    } | crontab -
    echo "[OK] cron removido do crontab."
}

cmd_status() {
    echo "── Agendamento (crontab) ────────────────"
    if read_crontab | grep -F "${CRONTAB_TAG}" >/dev/null 2>&1; then
        read_crontab | grep -F "${CRONTAB_TAG}"
    else
        echo "  (não agendado — rode: $0 install)"
    fi

    echo ""
    echo "── Últimos 5 logs ───────────────────────"
    if [[ -d "${LOG_DIR}" ]]; then
        local found=0
        # shellcheck disable=SC2012
        ls -1t "${LOG_DIR}"/dashboard_expedicao_????-??-??.log 2>/dev/null | head -5 | while IFS= read -r f; do
            local last_line
            last_line=$(grep -E 'wrapper finalizado' "$f" | tail -1)
            echo "  $(basename "$f"): ${last_line:-(sem linha de finalização)}"
            found=1
        done
        if [[ "${found}" -eq 0 ]] && ! ls "${LOG_DIR}"/dashboard_expedicao_????-??-??.log >/dev/null 2>&1; then
            echo "  (nenhum log encontrado em ${LOG_DIR})"
        fi
    else
        echo "  (sem diretório de logs em ${LOG_DIR})"
    fi
}

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

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

    echo ""
    echo "==================================================================="
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] wrapper iniciado (pid=$$, host=${CRON_HOST})"
    echo "==================================================================="

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

        cd "${GENESIS_ROOT}" || { echo "ERRO: GENESIS_ROOT não acessível: ${GENESIS_ROOT}"; exit 2; }
        export CRON_HOST

        "${PHP_BIN}" crons/dashboard_expedicao_diario.php \
            --com-enriquecimento \
            --max-google-calls="${MAX_GOOGLE_CALLS}"
    ) 9>"${LOCK_FILE}"
    local rc=$?

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

    find "${LOG_DIR}" -maxdepth 1 -name 'dashboard_expedicao_????-??-??.log' \
        -type f -mtime +"${LOG_RETENTION_DAYS}" -delete 2>/dev/null || true

    exit "${rc}"
}

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