#!/usr/bin/env bash
#MISE description="Deploy to bigblack with safety gates (v1.1)"
#MISE depends=["release:build-all"]

set -euo pipefail

REMOTE="bigblack"

echo "=== Deploy to $REMOTE ==="

# DEPL-02: Resolve deploy directory from systemd WorkingDirectory
DEPLOY_DIR=$(ssh "$REMOTE" 'systemctl --user show opendeviationbar-sidecar -p ExecStart --value 2>/dev/null' \
  | grep -oP '(?<=--chdir\s)\S+|(?<=WorkingDirectory=)\S+' 2>/dev/null \
  || echo "")

if [ -z "$DEPLOY_DIR" ]; then
    # Fallback: read from service file directly
    DEPLOY_DIR=$(ssh "$REMOTE" 'grep -oP "(?<=WorkingDirectory=).*" ~/.config/systemd/user/opendeviationbar-sidecar.service 2>/dev/null' \
      || echo "/home/tca/opendeviationbar-py")
fi
echo "✓ Deploy directory: $DEPLOY_DIR"

# DEPL-01: Build time assertion (stale wheel detection)
WHEEL=$(ls -t dist/*.whl 2>/dev/null | head -1)
if [ -z "$WHEEL" ]; then
    echo "❌ No wheel found in dist/. Run 'mise run release:build-all' first."
    exit 1
fi

# Check wheel age — if older than the latest commit, it's stale
WHEEL_MTIME=$(stat -f %m "$WHEEL" 2>/dev/null || stat -c %Y "$WHEEL" 2>/dev/null)
NOW=$(date +%s)
WHEEL_AGE=$((NOW - WHEEL_MTIME))
if [ "$WHEEL_AGE" -gt 300 ]; then
    echo "⚠  Wheel is ${WHEEL_AGE}s old (>5 min). Rebuilding..."
    BUILD_START=$(date +%s)
    mise run release:build-all
    BUILD_END=$(date +%s)
    BUILD_TIME=$((BUILD_END - BUILD_START))
    if [ "$BUILD_TIME" -lt 30 ]; then
        echo "❌ ABORT: Build completed in ${BUILD_TIME}s (<30s = stale cached wheel)"
        echo "   Run: cargo clean && mise run release:build-all"
        exit 1
    fi
    echo "✓ Fresh build: ${BUILD_TIME}s"
    WHEEL=$(ls -t dist/*.whl | head -1)
fi
echo "✓ Wheel: $(basename "$WHEEL")"

# Copy wheel to remote
echo "→ Copying wheel to $REMOTE:$DEPLOY_DIR/dist/"
ssh "$REMOTE" "mkdir -p $DEPLOY_DIR/dist"
scp "$WHEEL" "$REMOTE:$DEPLOY_DIR/dist/"

# Install on remote
echo "→ Installing..."
ssh "$REMOTE" "cd $DEPLOY_DIR && .venv/bin/pip install dist/$(basename "$WHEEL") --force-reinstall --no-deps -q"

# Stop sidecar + kintsugi
echo "→ Stopping services..."
ssh "$REMOTE" 'systemctl --user stop opendeviationbar-sidecar opendeviationbar-kintsugi 2>/dev/null || true'
sleep 2

# Start sidecar
echo "→ Starting sidecar..."
ssh "$REMOTE" 'systemctl --user start opendeviationbar-sidecar'

# DEPL-03: Post-start telemetry gate
echo "→ Waiting for StreamManager started..."
for i in $(seq 1 12); do
    if ssh "$REMOTE" "journalctl --user -u opendeviationbar-sidecar --since '60s ago' --no-pager 2>/dev/null | grep -q 'StreamManager started\|engine started\|sidecar_startup'" 2>/dev/null; then
        echo "✓ Sidecar confirmed running (attempt $i)"
        break
    fi
    if [ "$i" -eq 12 ]; then
        echo "❌ ABORT: Sidecar not started after 60s. Check logs:"
        echo "   ssh $REMOTE 'journalctl --user -u opendeviationbar-sidecar -n 50 --no-pager'"
        exit 1
    fi
    sleep 5
done

# Start kintsugi only after sidecar is confirmed running
echo "→ Starting kintsugi..."
ssh "$REMOTE" 'systemctl --user start opendeviationbar-kintsugi'
echo "✓ Kintsugi started"

echo ""
echo "==========================================="
echo " Deploy complete!"
echo "==========================================="
echo ""
echo "Monitor:"
echo "  ssh $REMOTE 'journalctl --user -u opendeviationbar-sidecar -f --no-pager'"
echo "  ssh $REMOTE 'journalctl --user -u opendeviationbar-kintsugi -f --no-pager'"
