#!/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}"
PLIST_SRC_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/launchagents" && pwd)"
PLIST_DST_DIR="${PLIST_DST_DIR:-$HOME/Library/LaunchAgents}"

LABELS=(
  com.bia.cierre-mes-dia1
  com.bia.cierre-mes-dia5
  com.bia.cierre-mes-dia7
  com.bia.nomina-pyg-dia1
  com.bia.nomina-pyg-dia5
  com.bia.nomina-pyg-dia7
)

usage() {
  cat <<'USAGE'
Uso:
  deploy/mac-mini/install-macmini-launchd.sh --dry-run
  deploy/mac-mini/install-macmini-launchd.sh --install

Variables de entorno opcionales:
  APP_DIR=/Users/rrhhjobs/rrhh-report
  PYTHON=/opt/homebrew/bin/python3
  ENV_FILE=/Users/rrhhjobs/rrhh-report/.env
  LOG_DIR=/Users/rrhhjobs/rrhh-report/logs/cloud
  PLIST_DST_DIR=/Users/rrhhjobs/Library/LaunchAgents

El .env debe definir: DATABASE_URL, PG_SCHEMA=public, NOMINA_API_KEY,
PYG_API_KEY, APP_VERIFY_SSL=true, APP_DEBUG_ERRORS=false.

Este script se corre EN el Mac mini, con sesion iniciada del usuario tecnico
(los LaunchAgents solo se ejecutan mientras esa sesion esta abierta).
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: falta el comando: $1" >&2
    exit 1
  fi
}

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

echo "== BIA Talento Humano - instalador launchd Mac mini =="
echo "mode: $MODE"
echo "app_dir: $APP_DIR"
echo "python: $PYTHON"
echo "env_file: $ENV_FILE"
echo "plist_dst_dir: $PLIST_DST_DIR"

require_command "$PYTHON"
require_command launchctl

if [[ "$(uname)" != "Darwin" ]]; then
  echo "ERROR: este instalador es solo para macOS" >&2
  exit 1
fi

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

if [[ ! -f "$ENV_FILE" ]]; then
  echo "ERROR: falta el .env privado: $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 deberia tener permiso 600 (chmod 600 \"$ENV_FILE\")" >&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 "== Verificacion de compilacion =="
"$PYTHON" -m py_compile app_config.py servidor.py cierre_mes.py cargar_historico_nomina_pyg.py

echo "== Verificacion de base de datos remota =="
"$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_ir),
           (SELECT MAX(periodo) FROM historico_nomina_pyg WHERE fuente = 'nomina')
""")
db, schema, empleados, max_fecha, max_ir, 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_ir={max_ir}")
print(f"max_nomina={max_nomina}")
cur.close()
conn.close()
PY

echo "== Pruebas seguras (sin escritura) =="
"$PYTHON" cierre_mes.py --test --solo-empleados-si-vacio
"$PYTHON" cargar_historico_nomina_pyg.py --mes-anterior --fuente ambas --dry-run

if [[ "$MODE" == "--dry-run" ]]; then
  echo "Dry-run completo. Vuelve a correr con --install en el Mac mini para instalar los LaunchAgents."
  exit 0
fi

mkdir -p "$PLIST_DST_DIR"

echo "== Instalando LaunchAgents =="
for label in "${LABELS[@]}"; do
  src="$PLIST_SRC_DIR/$label.plist"
  dst="$PLIST_DST_DIR/$label.plist"

  if [[ ! -f "$src" ]]; then
    echo "ERROR: falta la plantilla: $src" >&2
    exit 1
  fi

  sed \
    -e "s#__APP_DIR__#$APP_DIR#g" \
    -e "s#__PYTHON__#$PYTHON#g" \
    "$src" > "$dst"

  launchctl unload "$dst" >/dev/null 2>&1 || true
  launchctl load -w "$dst"
  echo "OK $label -> $dst"
done

echo "== LaunchAgents cargados =="
launchctl list | grep com.bia || true

echo ""
echo "Siguiente paso obligatorio (no lo hace este script):"
echo "En el Mac que ejecutaba los cierres localmente, correr:"
echo ""
for label in "${LABELS[@]}"; do
  echo "  launchctl unload ~/Library/LaunchAgents/$label.plist"
done
echo ""
echo "para evitar que ambos equipos escriban el mismo cierre."
