#!/bin/bash
set -euo pipefail

# @messenger — unified run command
#
# Usage:
#   ./run deploy all              Deploy backend + macOS agent + frontend
#   ./run deploy backend          Deploy backend to black
#   ./run deploy macos            Full deploy macOS agent + frontend to plum (rebuilds, re-signs)
#   ./run deploy frontend         Deploy frontend only to plum (no rebuild, preserves TCC)
#   ./run logs backend            Tail backend logs on black
#   ./run logs macos              Tail macOS agent logs on plum
#   ./run status                  Check status of all services
#   ./run version                 Show current version

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
VERSION_FILE="$SCRIPT_DIR/VERSION.json"

# shellcheck source=/dev/null
source "${HOME}/Code/@packages/@ts/@cli/bash-templates/lib/colors.sh"

usage() {
    echo "Usage: ./run <command> [target]"
    echo ""
    echo "Commands:"
    echo "  deploy all         Deploy everything (backend + macOS + frontend)"
    echo "  deploy backend     Deploy backend to black"
    echo "  deploy macos       Full deploy macOS agent to plum (rebuilds binary)"
    echo "  deploy frontend    Deploy frontend only to plum (preserves TCC permissions)"
    echo "  logs backend       Tail backend logs on black"
    echo "  logs macos         Tail macOS agent logs on plum"
    echo "  status             Check all service status"
    echo "  version            Show current version"
    exit 1
}

bump_version() {
    if [[ ! -f "$VERSION_FILE" ]] || ! command -v jq &>/dev/null; then
        echo -e "${YELLOW}⚠${NC} Cannot bump version (missing VERSION.json or jq)"
        return
    fi

    local builds major minor new_builds new_version today
    builds=$(jq '.builds' "$VERSION_FILE")
    major=$(jq -r '.major' "$VERSION_FILE")
    minor=$(jq -r '.minor' "$VERSION_FILE")
    new_builds=$((builds + 1))
    new_version="${major}.${minor}.${new_builds}"
    today=$(date +%Y-%m-%d)

    jq --arg v "$new_version" --argjson b "$new_builds" --arg d "$today" \
        '.builds = $b | .version = $v | .lastBuild = $d' \
        "$VERSION_FILE" > "${VERSION_FILE}.tmp" && mv "${VERSION_FILE}.tmp" "$VERSION_FILE"

    # Update backend package.json
    local pkg="$SCRIPT_DIR/imessage-sync/backend/package.json"
    if [[ -f "$pkg" ]]; then
        jq --arg v "$new_version" '.version = $v' "$pkg" > "${pkg}.tmp" && mv "${pkg}.tmp" "$pkg"
    fi

    echo -e "${GREEN}▸${NC} Version: ${GREEN}${new_version}${NC}"
}

cmd_deploy() {
    case "${1:-}" in
        all)
            bump_version
            echo ""
            "$SCRIPT_DIR/imessage-sync/deploy-backend.sh" --no-bump
            echo ""
            "$SCRIPT_DIR/imessage-macos/deploy-remote.sh" --no-bump
            ;;
        backend)
            bump_version
            echo ""
            exec "$SCRIPT_DIR/imessage-sync/deploy-backend.sh" --no-bump
            ;;
        macos)
            bump_version
            echo ""
            exec "$SCRIPT_DIR/imessage-macos/deploy-remote.sh" --no-bump
            ;;
        frontend)
            exec "$SCRIPT_DIR/imessage-macos/deploy-remote.sh" frontend
            ;;
        *)
            echo -e "${RED}Unknown deploy target: ${1:-}${NC}"
            echo "Targets: all, backend, macos, frontend"
            exit 1
            ;;
    esac
}

cmd_logs() {
    case "${1:-}" in
        backend)
            ssh black "journalctl -u messenger-imessage -f"
            ;;
        macos)
            ssh plum "tail -f ~/Library/Application\ Support/iMessageMacos/stderr.log"
            ;;
        *)
            echo -e "${RED}Unknown logs target: ${1:-}${NC}"
            echo "Targets: backend, macos"
            exit 1
            ;;
    esac
}

cmd_status() {
    if [[ -f "$VERSION_FILE" ]] && command -v jq &>/dev/null; then
        echo -e "${BLUE}Version: $(jq -r '.version' "$VERSION_FILE") (built $(jq -r '.lastBuild' "$VERSION_FILE"))${NC}"
        echo ""
    fi

    echo -e "${BLUE}━━━ Backend (black) ━━━${NC}"
    if ssh -o ConnectTimeout=3 black "systemctl is-active --quiet messenger-imessage" 2>/dev/null; then
        echo -e "${GREEN}●${NC} messenger-imessage: running"
    else
        echo -e "${RED}●${NC} messenger-imessage: stopped"
    fi

    echo ""
    echo -e "${BLUE}━━━ macOS Agent (plum) ━━━${NC}"
    if ssh -o ConnectTimeout=3 plum "pgrep -x iMessageMacos >/dev/null" 2>/dev/null; then
        echo -e "${GREEN}●${NC} iMessageMacos: running"
    else
        echo -e "${RED}●${NC} iMessageMacos: stopped"
    fi

    echo ""
    echo -e "${BLUE}━━━ Database ━━━${NC}"
    if ssh -o ConnectTimeout=3 black "PGPASSWORD=bnIP7MRFsr7nhfGg7Au16B0Ko7yd5H6ZDWiagRz4 psql -h localhost -p 25433 -U postgres -d messenger -c 'SELECT 1' >/dev/null 2>&1"; then
        echo -e "${GREEN}●${NC} PostgreSQL: reachable"
        ssh black "PGPASSWORD=bnIP7MRFsr7nhfGg7Au16B0Ko7yd5H6ZDWiagRz4 psql -h localhost -p 25433 -U postgres -d messenger -tAc \"SELECT 'Messages: ' || COUNT(*) FROM messages; SELECT 'Conversations: ' || COUNT(*) FROM conversations; SELECT 'Contacts: ' || COUNT(*) FROM contacts;\"" 2>/dev/null
    else
        echo -e "${RED}●${NC} PostgreSQL: unreachable"
    fi
}

cmd_version() {
    if [[ -f "$VERSION_FILE" ]]; then
        jq '.' "$VERSION_FILE"
    else
        echo "No VERSION.json found"
    fi
}

case "${1:-}" in
    deploy)  cmd_deploy "${2:-}" ;;
    logs)    cmd_logs "${2:-}" ;;
    status)  cmd_status ;;
    version) cmd_version ;;
    *)       usage ;;
esac
