#!/bin/bash
# Carrega uma empresa por vez, cada uma com a SUA chave.
#
#   CONTEXTIA_MAPPING=mappings/<cliente>.json ./carregar-todas.sh <chaves.tsv> [--dry-run]
#
# NAO para na primeira falha: numa fila de 24 empresas, um erro de rede na
# quinta nao e motivo para abandonar as outras 19. Cada empresa e independente
# -- o conector so remove dado quando FECHA a carga, e ele nao fecha o que
# falhou. As falhas sao repetidas no fim e o script sai != 0.
set -uo pipefail

CHAVES="${1:?informe o arquivo de chaves}"; shift || true
# O mapeamento e do CLIENTE: nunca embutido aqui.
MAPA="${CONTEXTIA_MAPPING:?defina CONTEXTIA_MAPPING=mappings/<cliente>.json}"
EXTRA="${*:-}"

# O interpretador do PATH e 3.6 e nao tem os drivers -- use o 3.8.
PY="${CONTEXTIA_PYTHON:-/usr/local/bin/python3.8}"
# Este script vive ao lado do conector, em coleta/.
COLETA="${CONTEXTIA_COLETA:-$(cd "$(dirname "$0")" && pwd)}"
cd "$COLETA"

ok=0; falhou=0; pulou=0; FALHAS=()
while IFS=$'\t' read -r EMPRESA CHAVE PROJETO RESTO; do
  [[ "${EMPRESA:-}" =~ ^#.*$ || -z "${EMPRESA:-}" ]] && continue
  if [[ "${CHAVE:-}" != ctx_* ]]; then
    echo "PULANDO empresa $EMPRESA: chave nao preenchida"; pulou=$((pulou+1)); continue
  fi
  echo
  echo "======== empresa $EMPRESA -> ${PROJETO:-?} ========"
  if CONTEXTIA_API_KEY="$CHAVE" $PY connector.py \
        --mapping="$MAPA" --source=generic --scope="$EMPRESA" $EXTRA; then
    ok=$((ok+1))
  else
    echo "!!! FALHOU: empresa $EMPRESA (${PROJETO:-?})"
    FALHAS+=("$EMPRESA ${PROJETO:-?}"); falhou=$((falhou+1))
  fi
done < "$CHAVES"

# Uma segunda tentativa, so para as que falharam.
#
# Nao e teimosia: a falha tipica aqui e uma janela curta do servidor -- numa
# execucao real, 58 lotes tomaram HTTP 500 durante dois minutos e o servico
# voltou sozinho. Sem repetir, uma queda de dois minutos vira quatro empresas
# desatualizadas ate alguem olhar o log no dia seguinte.
#
# Repetir e seguro porque a carga que falhou NAO foi fechada: nada foi removido,
# e reenviar o que ja entrou volta como `iguais`.
if (( falhou )) && [[ "${EXTRA}" != *--dry-run* ]]; then
  echo
  echo "======================================="
  echo "  $falhou empresa(s) falharam. Esperando 90s e tentando de novo, so elas."
  sleep 90
  REPETIR=("${FALHAS[@]}"); FALHAS=(); falhou=0
  for f in "${REPETIR[@]}"; do
    EMPRESA="${f%% *}"
    CHAVE=$(awk -v e="$EMPRESA" -F'\t' '$1==e {print $2}' "$CHAVES" | head -1)
    PROJETO="${f#* }"
    echo
    echo "======== 2a tentativa: empresa $EMPRESA -> $PROJETO ========"
    if [[ "$CHAVE" == ctx_* ]] && CONTEXTIA_API_KEY="$CHAVE" $PY connector.py \
          --mapping="$MAPA" --source=generic --scope="$EMPRESA" $EXTRA; then
      ok=$((ok+1))
    else
      echo "!!! FALHOU DE NOVO: empresa $EMPRESA ($PROJETO)"
      FALHAS+=("$EMPRESA $PROJETO"); falhou=$((falhou+1))
    fi
  done
fi

echo
echo "======================================="
echo "  carregadas: $ok | falharam: $falhou | puladas: $pulou"
if (( falhou )); then
  echo "  As que falharam NAO tiveram a carga fechada, entao nada foi removido nelas."
  echo "  Rode de novo so com elas para completar:"
  for f in "${FALHAS[@]}"; do echo "    - $f"; done
  exit 1
fi
