#!/usr/bin/env bash
set -euo pipefail

ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
SQL_FILE="$ROOT_DIR/scripts/validar_promedios_rapido.sql"
PARAM_FILE="$ROOT_DIR/app/config/parameters.yml"
MYSQL_BIN="${MYSQL_BIN:-mysql}"

PERIODO="$(date -v-1m +%Y-%m 2>/dev/null || date -d '1 month ago' +%Y-%m 2>/dev/null || date +%Y-%m)"
DB_HOST="${DB_HOST:-}"
DB_PORT="${DB_PORT:-}"
DB_NAME="${DB_NAME:-}"
DB_USER="${DB_USER:-}"
DB_PASS="${DB_PASS:-}"
MOSTRAR_SALIDA_COMPLETA=0

usage() {
  cat <<'EOF'
Uso:
  scripts/validar_promedios_rapido.sh [opciones]

Opciones:
  -p, --periodo YYYY-MM      Periodo a validar (por defecto: mes anterior)
      --host HOST            Host MySQL
      --port PORT            Puerto MySQL
      --db NOMBRE            Base de datos
      --user USUARIO         Usuario MySQL
      --pass CLAVE           Clave MySQL
      --mysql-bin RUTA       Binario mysql (default: mysql)
      --full-output          Mostrar salida completa de mysql
  -h, --help                 Mostrar ayuda

Notas:
  - Si no envias host/port/db/user/pass, se intentan leer de app/config/parameters.yml.
  - Tambien puedes pasar credenciales por variables de entorno DB_HOST, DB_PORT, DB_NAME, DB_USER, DB_PASS.
EOF
}

extract_yaml_value() {
  local key="$1"
  local line
  if [[ ! -f "$PARAM_FILE" ]]; then
    echo ""
    return 0
  fi

  line="$(grep -E "^[[:space:]]*$key:" "$PARAM_FILE" | head -1 || true)"
  if [[ -z "$line" ]]; then
    echo ""
    return 0
  fi

  line="${line#*:}"
  line="$(echo "$line" | sed -E "s/^[[:space:]]+|[[:space:]]+$//g")"
  line="${line%\"}"
  line="${line#\"}"
  line="${line%\'}"
  line="${line#\'}"
  echo "$line"
}

validar_periodo() {
  local p="$1"
  [[ "$p" =~ ^[0-9]{4}-(0[1-9]|1[0-2])$ ]]
}

while [[ $# -gt 0 ]]; do
  case "$1" in
    -p|--periodo)
      PERIODO="${2:-}"
      shift 2
      ;;
    --host)
      DB_HOST="${2:-}"
      shift 2
      ;;
    --port)
      DB_PORT="${2:-}"
      shift 2
      ;;
    --db)
      DB_NAME="${2:-}"
      shift 2
      ;;
    --user)
      DB_USER="${2:-}"
      shift 2
      ;;
    --pass)
      DB_PASS="${2:-}"
      shift 2
      ;;
    --mysql-bin)
      MYSQL_BIN="${2:-}"
      shift 2
      ;;
    --full-output)
      MOSTRAR_SALIDA_COMPLETA=1
      shift
      ;;
    -h|--help)
      usage
      exit 0
      ;;
    *)
      echo "Argumento no reconocido: $1" >&2
      usage
      exit 1
      ;;
  esac
done

if ! validar_periodo "$PERIODO"; then
  echo "Error: periodo invalido '$PERIODO'. Usa formato YYYY-MM." >&2
  exit 1
fi

if [[ ! -f "$SQL_FILE" ]]; then
  echo "Error: no existe el archivo SQL: $SQL_FILE" >&2
  exit 1
fi

if ! command -v "$MYSQL_BIN" >/dev/null 2>&1; then
  echo "Error: no se encontro el cliente mysql: $MYSQL_BIN" >&2
  exit 1
fi

# Cargar defaults desde parameters.yml si no llegaron por args/env
if [[ -z "$DB_HOST" ]]; then DB_HOST="$(extract_yaml_value database_host)"; fi
if [[ -z "$DB_PORT" ]]; then DB_PORT="$(extract_yaml_value database_port)"; fi
if [[ -z "$DB_NAME" ]]; then DB_NAME="$(extract_yaml_value database_name)"; fi
if [[ -z "$DB_USER" ]]; then DB_USER="$(extract_yaml_value database_user)"; fi
if [[ -z "$DB_PASS" ]]; then DB_PASS="$(extract_yaml_value database_password)"; fi

if [[ -z "$DB_HOST" || -z "$DB_PORT" || -z "$DB_NAME" || -z "$DB_USER" ]]; then
  echo "Error: faltan datos de conexion (host/port/db/user)." >&2
  echo "Pasa argumentos --host --port --db --user [--pass] o configura app/config/parameters.yml" >&2
  exit 1
fi

SQL_CMD="SET @p='${PERIODO}'; SOURCE ${SQL_FILE};"

echo "Validando promedios para periodo $PERIODO en ${DB_HOST}:${DB_PORT}/${DB_NAME} ..."

set +e
SALIDA="$(MYSQL_PWD="$DB_PASS" "$MYSQL_BIN" \
  --batch --raw --skip-column-names \
  --host="$DB_HOST" --port="$DB_PORT" --user="$DB_USER" "$DB_NAME" \
  --execute "$SQL_CMD" 2>&1)"
EXIT_CODE=$?
set -e

if [[ $EXIT_CODE -ne 0 ]]; then
  echo "Error ejecutando validacion SQL:" >&2
  echo "$SALIDA" >&2
  exit $EXIT_CODE
fi

if [[ $MOSTRAR_SALIDA_COMPLETA -eq 1 ]]; then
  echo
  echo "Salida completa:"
  echo "$SALIDA"
  echo
fi

OK_COUNT=0
ERROR_COUNT=0
INFO_COUNT=0

printf "%-45s | %-12s | %-6s\n" "Regla" "Casos/Detalle" "Estado"
printf "%s\n" "--------------------------------------------------------------"

while IFS=$'\t' read -r col1 col2 col3 _; do
  [[ -z "${col1:-}" ]] && continue
  estado="${col3:-INFO}"
  detalle="${col2:-}"

  case "$estado" in
    OK)    ((OK_COUNT+=1)) ;;
    ERROR) ((ERROR_COUNT+=1)) ;;
    *)     ((INFO_COUNT+=1)) ;;
  esac

  printf "%-45s | %-12s | %-6s\n" "$col1" "$detalle" "$estado"
done <<< "$SALIDA"

echo
printf "Resumen: OK=%d ERROR=%d INFO=%d\n" "$OK_COUNT" "$ERROR_COUNT" "$INFO_COUNT"

if [[ $ERROR_COUNT -gt 0 ]]; then
  exit 2
fi

exit 0
