#!/bin/bash
# Instalador TERMICA — gerado pelo ESP ateliê
set -euo pipefail
ESP_IP="dobalacobaco.dmzgate.com"
BASE="http://dobalacobaco.dmzgate.com:8080"
QUEUE="TERMICA"
SPOOL_PORT=9101
APP_SUPPORT="$HOME/Library/Application Support/atelie-esp"
LAUNCH_AGENTS="$HOME/Library/LaunchAgents"
PLIST_DST="$LAUNCH_AGENTS/com.atelie.esp-print-spooler.plist"
LOG_DIR="$HOME/Library/Logs"
PYTHON_BIN="$(command -v python3 || true)"
if [[ -z "$PYTHON_BIN" ]]; then echo "ERRO: python3 nao encontrado"; exit 1; fi
echo "==> ESP: $ESP_IP"
echo "==> Baixando de $BASE"
if curl -fsS -m 5 "$BASE/status" >/tmp/atelie-esp-status.json; then
  echo "==> status: $(cat /tmp/atelie-esp-status.json)"
else
  echo "AVISO: ESP nao respondeu em $BASE/status" >&2
fi
mkdir -p "$APP_SUPPORT" "$LAUNCH_AGENTS" "$LOG_DIR"
curl -fsSL "$BASE/install/mac_print_spooler.py" -o "$APP_SUPPORT/mac_print_spooler.py"
chmod +x "$APP_SUPPORT/mac_print_spooler.py"
printf '%s\n' "{\"esp\": \"${ESP_IP}\", \"port\": ${SPOOL_PORT}}" > "$APP_SUPPORT/config.json"
pkill -f 'mac_print_spooler.py' 2>/dev/null || true
sleep 0.4
cat > "$PLIST_DST" <<PLIST
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"><dict>
<key>Label</key><string>com.atelie.esp-print-spooler</string>
<key>ProgramArguments</key><array>
<string>$PYTHON_BIN</string>
<string>$APP_SUPPORT/mac_print_spooler.py</string>
</array>
<key>RunAtLoad</key><true/>
<key>KeepAlive</key><true/>
<key>WorkingDirectory</key><string>$APP_SUPPORT</string>
<key>StandardOutPath</key><string>$LOG_DIR/atelie-esp-spooler.log</string>
<key>StandardErrorPath</key><string>$LOG_DIR/atelie-esp-spooler.err.log</string>
<key>ProcessType</key><string>Background</string>
</dict></plist>
PLIST
launchctl bootout "gui/$(id -u)/com.atelie.esp-print-spooler" 2>/dev/null || true
launchctl bootstrap "gui/$(id -u)" "$PLIST_DST"
launchctl enable "gui/$(id -u)/com.atelie.esp-print-spooler" 2>/dev/null || true
launchctl kickstart -k "gui/$(id -u)/com.atelie.esp-print-spooler"
sleep 0.8
if ! lsof -nP -iTCP:$SPOOL_PORT -sTCP:LISTEN >/dev/null 2>&1; then
  echo "ERRO: spooler nao escutou :$SPOOL_PORT" >&2
  tail -n 30 "$LOG_DIR/atelie-esp-spooler.err.log" 2>/dev/null || true
  exit 1
fi
echo "==> spooler OK 127.0.0.1:$SPOOL_PORT"
PPD=""
for p in /Library/Printers/PPDs/Contents/Resources/4B-2054L.ppd \
         /Library/Printers/PPDs/Contents/Resources/4B-2054A.ppd; do
  [[ -f "$p" ]] && PPD="$p" && break
done
if [[ -n "$PPD" ]]; then
  echo "==> PPD: $PPD"
  lpadmin -p "$QUEUE" -E -v "socket://127.0.0.1:${SPOOL_PORT}" -P "$PPD" \
    -o printer-is-shared=false -D "TERMICA atelie (ESP32)" -L "Atelie DarciLarsen"
else
  echo "AVISO: instale o driver 4BARCODE/Tomate 4B-2054L e rode de novo." >&2
  lpadmin -p "$QUEUE" -E -v "socket://127.0.0.1:${SPOOL_PORT}" \
    -o printer-is-shared=false -D "TERMICA atelie (ESP32)" -L "Atelie DarciLarsen" || true
fi
cupsenable "$QUEUE" 2>/dev/null || true
cupsaccept "$QUEUE" 2>/dev/null || true
lpoptions -d "$QUEUE" >/dev/null 2>&1 || true
echo; echo "Pronto. Fila $QUEUE -> ESP $ESP_IP"
lpstat -v "$QUEUE" 2>/dev/null || true
