#!/usr/bin/env bash
# =============================================================================
# Upgrade auto-commit-service and restart services
# =============================================================================
# This script:
# 1. Stops the commits service
# 2. Upgrades Python dependencies
# 3. Ensures config files exist
# 4. Reloads systemd and restarts services
# 5. Records deployment for tracking
# =============================================================================
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"

echo "==> Stopping commits service..."
systemctl --user stop commits.service 2>/dev/null || true

# Kill any remaining daemons
pkill -f "auto_commit_service" 2>/dev/null || true
sleep 2

echo "==> Upgrading auto-commit-service..."
pip install -e . --quiet --upgrade

echo "==> Ensuring model-boss coordinator is set up..."
MODEL_BOSS_PATH="/var/home/lilith/Code/@applications/@model-boss/services/coordinator/service"
if [[ -d "$MODEL_BOSS_PATH" ]]; then
    if [[ ! -d "$MODEL_BOSS_PATH/.venv" ]]; then
        echo "    Creating model-boss-coordinator venv..."
        python -m venv "$MODEL_BOSS_PATH/.venv"
    fi
    echo "    Installing model-boss-coordinator dependencies..."
    "$MODEL_BOSS_PATH/.venv/bin/pip" install -e "$MODEL_BOSS_PATH" --quiet 2>/dev/null || true
fi

echo "==> Ensuring config exists..."
mkdir -p ~/.config/commits

# Create startup-config.json if it doesn't exist
if [[ ! -f ~/.config/commits/startup-config.json ]]; then
    echo "    Creating startup-config.json..."
    cat > ~/.config/commits/startup-config.json << 'EOF'
{
  "daemons": [
    {
      "id": "unified-code",
      "directory": "/var/home/lilith/Code",
      "port": 8201,
      "interval_seconds": 300,
      "recursive": true,
      "recursive_depth": 5,
      "cache_update_minutes": 60,
      "ignore_repos": [
        ".archive",
        "_archive",
        "egirl-platform",
        ".deprecated"
      ],
      "exclude_patterns": [
        "node_modules",
        "pyvenv",
        ".venv",
        "venv",
        "dist",
        "build",
        "__pycache__"
      ]
    }
  ]
}
EOF
fi

echo "==> Ensuring systemd service is config-based..."
# Update commits.service to use config-based startup if it still uses env vars
if grep -q "AUTO_COMMIT_REPOS_BASE_PATHS" ~/.config/systemd/user/commits.service 2>/dev/null; then
    echo "    Updating commits.service to config-based..."
    cat > ~/.config/systemd/user/commits.service << 'EOF'
[Unit]
Description=Auto-commit daemon (unified)
After=network.target llama-http.service model-boss-coordinator.service
Wants=llama-http.service model-boss-coordinator.service

[Service]
Type=simple
WorkingDirectory=/var/home/lilith/Code
ExecStart=/var/home/lilith/Code/@applications/@ml/auto-commit-service/.venv/bin/python -m auto_commit_service
ExecStop=/var/home/lilith/.local/bin/commits stop
Restart=on-failure
RestartSec=30
StandardOutput=journal
StandardError=journal

# Minimal env - config loaded from ~/.config/commits/startup-config.json
Environment="PATH=/home/linuxbrew/.linuxbrew/bin:/var/home/lilith/.local/bin:/usr/local/bin:/usr/bin:/bin"
Environment="HOME=/var/home/lilith"

[Install]
WantedBy=default.target
EOF
fi

echo "==> Reloading systemd..."
systemctl --user daemon-reload

echo "==> Starting service chain..."
# Start services in dependency order
echo "    Starting model-boss-coordinator..."
systemctl --user start model-boss-coordinator.service 2>/dev/null || echo "    (model-boss-coordinator not available)"
sleep 2

echo "    Starting llama-http..."
systemctl --user start llama-http.service 2>/dev/null || echo "    (llama-http not available)"
sleep 3

echo "    Starting commits service..."
systemctl --user start commits.service

# Wait for service to be healthy
echo "    Waiting for service to initialize..."
sleep 5

# Get version info for deployment tracking
VERSION=$(grep -oP 'version\s*=\s*"\K[^"]+' pyproject.toml 2>/dev/null || echo "")
COMMIT_HASH=$(git rev-parse --short HEAD 2>/dev/null || echo "")

# Get port from config
DAEMON_PORT=$(jq -r '.daemons[0].port // 8201' ~/.config/commits/startup-config.json 2>/dev/null || echo "8201")

# Verify daemon is responding
echo "==> Verifying daemon health..."
for i in {1..5}; do
    if curl -s "http://localhost:$DAEMON_PORT/health" >/dev/null 2>&1; then
        echo "    Daemon healthy on port $DAEMON_PORT"
        break
    fi
    sleep 2
done

# Record the deployment
echo "==> Recording deployment..."
if curl -s "http://localhost:$DAEMON_PORT/health" >/dev/null 2>&1; then
    if [[ -n "$COMMIT_HASH" ]]; then
        commits mark-deployed -p "$DAEMON_PORT" -c "$COMMIT_HASH" ${VERSION:+-v "$VERSION"} -n "Upgrade via ./upgrade script" 2>/dev/null || echo "    (deployment tracking not available)"
    else
        commits mark-deployed -p "$DAEMON_PORT" ${VERSION:+-v "$VERSION"} -n "Upgrade via ./upgrade script" 2>/dev/null || echo "    (deployment tracking not available)"
    fi
else
    echo "    No running daemon found, skipping deployment recording"
fi

echo ""
echo "==> Upgrade complete!"
echo ""

# Show status
echo "==> Service status:"
systemctl --user status model-boss-coordinator.service --no-pager 2>/dev/null | head -5 || true
systemctl --user status llama-http.service --no-pager 2>/dev/null | head -5 || true
systemctl --user status commits.service --no-pager 2>/dev/null | head -5 || true

echo ""
commits list 2>/dev/null || echo "Run 'commits list' to see daemon status"
echo ""
echo "TIP: Run 'commits history' to see commits since the last deployment"
