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

MODE="${1:---dry-run}"
APP_DIR="${APP_DIR:-$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)}"
PYTHON="${PYTHON:-$(command -v python3)}"
ENV_FILE="${ENV_FILE:-$APP_DIR/.env}"
LOG_DIR="${LOG_DIR:-$APP_DIR/logs/cloud}"
BEGIN_MARK="# BEGIN BIA_TALENTO_HUMANO_CLOUD_CRON"
END_MARK="# END BIA_TALENTO_HUMANO_CLOUD_CRON"

usage() {
  cat <<'USAGE'
Usage:
  deploy/install-cloud-cron.sh --dry-run
  deploy/install-cloud-cron.sh --install

Environment overrides:
  APP_DIR=/opt/rrhh-report
  PYTHON=/usr/bin/python3
  ENV_FILE=/opt/rrhh-report/.env
  LOG_DIR=/opt/rrhh-report/logs/cloud

The .env file must contain DATABASE_URL, PG_SCHEMA=public, NOMINA_API_KEY,
PYG_API_KEY, APP_VERIFY_SSL=true, APP_DEBUG_ERRORS=false.
USAGE
}

if [[ "$MODE" != "--dry-run" && "$MODE" != "--install" ]]; then
  usage
  exit 2
fi

require_command() {
  if ! command -v "$1" >/dev/null 2>&1; then
    echo "ERROR: missing command: $1" >&2
    exit 1
  fi
}

require_env_key() {
  local key="$1"
  if ! grep -Eq "^${key}=.+" "$ENV_FILE"; then
    echo "ERROR: $ENV_FILE must define $key" >&2
    exit 1
  fi
}

echo "== BIA Talento Humano cloud cron installer =="
echo "mode: $MODE"
echo "app_dir: $APP_DIR"
echo "python: $PYTHON"
echo "env_file: $ENV_FILE"

require_command "$PYTHON"
require_command crontab

if [[ ! -d "$APP_DIR" ]]; then
  echo "ERROR: APP_DIR does not exist: $APP_DIR" >&2
  exit 1
fi

if [[ ! -f "$ENV_FILE" ]]; then
  echo "ERROR: missing private env file: $ENV_FILE" >&2
  exit 1
fi

env_perm="$("$PYTHON" - "$ENV_FILE" <<'PY'
import os
import sys

print(oct(os.stat(sys.argv[1]).st_mode & 0o777)[2:])
PY
)"
if [[ "$env_perm" != "600" ]]; then
  echo "WARNING: $ENV_FILE should have permission 600" >&2
fi

require_env_key DATABASE_URL
require_env_key PG_SCHEMA
require_env_key NOMINA_API_KEY
require_env_key PYG_API_KEY

cd "$APP_DIR"
mkdir -p "$LOG_DIR"

echo "== Compile check =="
"$PYTHON" -m py_compile app_config.py servidor.py cierre_mes.py cargar_historico_nomina_pyg.py

echo "== Database check =="
"$PYTHON" - <<'PY'
from app_config import db_config
import psycopg2

conn = psycopg2.connect(**db_config())
cur = conn.cursor()
cur.execute("""
    SELECT current_database(), current_schema(),
           (SELECT COUNT(*) FROM historico_empleados),
           (SELECT MAX(fecha)::text FROM historico_empleados),
           (SELECT MAX(periodo) FROM historico_nomina_pyg WHERE fuente = 'nomina')
""")
db, schema, empleados, max_fecha, max_nomina = cur.fetchone()
print(f"database={db}")
print(f"schema={schema}")
print(f"historico_empleados={empleados}")
print(f"max_empleados={max_fecha}")
print(f"max_nomina={max_nomina}")
cur.close()
conn.close()
PY

echo "== Safe job checks =="
"$PYTHON" cierre_mes.py --test --solo-empleados-si-vacio
"$PYTHON" cargar_historico_nomina_pyg.py --mes-anterior --fuente ambas --dry-run

CRON_BLOCK="$(cat <<CRON
$BEGIN_MARK
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin

0 5 1 * * cd "$APP_DIR" && mkdir -p "$LOG_DIR" && "$PYTHON" cierre_mes.py --empleados-activos-detalle >> "$LOG_DIR/cierre_mes_dia1.log" 2>&1
0 5 5,7 * * cd "$APP_DIR" && mkdir -p "$LOG_DIR" && "$PYTHON" cierre_mes.py --solo-empleados-si-vacio >> "$LOG_DIR/cierre_mes_dia5_7.log" 2>&1
30 5 1,5,7 * * cd "$APP_DIR" && mkdir -p "$LOG_DIR" && "$PYTHON" cargar_historico_nomina_pyg.py --mes-anterior --fuente ambas >> "$LOG_DIR/nomina_pyg.log" 2>&1
$END_MARK
CRON
)"

echo "== Cron block =="
echo "$CRON_BLOCK"

if [[ "$MODE" == "--dry-run" ]]; then
  echo "Dry-run complete. Re-run with --install on the cloud runner to install cron."
  exit 0
fi

tmp_current="$(mktemp)"
tmp_new="$(mktemp)"
trap 'rm -f "$tmp_current" "$tmp_new"' EXIT

crontab -l > "$tmp_current" 2>/dev/null || true
awk -v begin="$BEGIN_MARK" -v end="$END_MARK" '
  $0 == begin {skip=1; next}
  $0 == end {skip=0; next}
  skip != 1 {print}
' "$tmp_current" > "$tmp_new"

{
  cat "$tmp_new"
  echo ""
  echo "$CRON_BLOCK"
} | crontab -

echo "Cron installed. Current managed entries:"
crontab -l | awk -v begin="$BEGIN_MARK" -v end="$END_MARK" '
  $0 == begin {show=1}
  show == 1 {print}
  $0 == end {show=0}
'
