#!/usr/bin/env bash
# Registers all domains with UptimeRobot via API
# Usage: uptime-monitor-setup --api-key <KEY>
#        uptime-monitor-setup --list
#        uptime-monitor-setup --delete-all

set -uo pipefail

LOG_FILE="/opt/server-resilience/logs/uptime-setup-$(date +%Y%m%d).log"
CREDS_FILE="/opt/server-resilience/etc/uptimerobot-credentials"

log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE"; }

# Domains to monitor — all cPanel domains + key subdomains
DOMAINS=(
    "https://canadasmarketplace.ca"
    "https://communitymarketplace.ca"
    "https://cmptv.ca"
    "https://news.cmptv.ca"
    "https://manage.cmptv.ca"
    "https://ordereats.ca"
    "https://planetgiftcards.org"
    "https://mycommunitytv.org"
    "https://surecleancompany.com"
    "https://zeusdemolitions.com"
    "https://communitycontractors.ca"
    "https://allseasonsolutions.ca"
    "https://communitymusicmatters.com"
    "https://e-newsletterhero.com"
    "https://communitygetaways.com"
    "https://communitysportsmatters.com"
    "https://elitecontractor.org"
    "https://givebackgiftcards.org"
    "https://givebackhero.org"
    "https://givebackmom.com"
    "https://givebackpromotions.org"
    "https://icanhero.com"
    "https://just1vote.ca"
    "https://levelupforlocal.com"
    "https://localmealsthatheal.com"
    "https://localrealestatetv.com"
    "https://networkandbuild.org"
    "https://pickuppal.ca"
    "https://printandposter.ca"
    "https://revelation-care.org"
    "https://rodnorville.ca"
    "https://spotlessauto.ca"
    "https://andrewmcvey.ca"
)

MODE="${1:-}"
API_KEY=""

# Load stored key if available
if [ -f "$CREDS_FILE" ]; then
    source "$CREDS_FILE"
    API_KEY="${UPTIMEROBOT_API_KEY:-}"
fi

# Override with CLI arg
if [ "$MODE" = "--api-key" ]; then
    API_KEY="${2:-}"
    if [ -z "$API_KEY" ]; then
        echo "Usage: uptime-monitor-setup --api-key <YOUR_API_KEY>"
        exit 1
    fi
    # Save it
    cat > "$CREDS_FILE" << EOF
UPTIMEROBOT_API_KEY=$API_KEY
EOF
    chmod 600 "$CREDS_FILE"
    log "API key saved to $CREDS_FILE"
fi

if [ -z "$API_KEY" ]; then
    echo "ERROR: No UptimeRobot API key configured."
    echo "Run: uptime-monitor-setup --api-key <YOUR_MAIN_API_KEY>"
    echo "Get key from: https://uptimerobot.com/dashboard#mySettings"
    exit 1
fi

list_monitors() {
    log "Fetching existing monitors..."
    RESULT=$(curl -s -X POST "https://api.uptimerobot.com/v2/getMonitors" \
        -H "Content-Type: application/x-www-form-urlencoded" \
        --data-urlencode "api_key=$API_KEY" \
        --data-urlencode "format=json")
    echo "$RESULT" | python3 -c "
import json,sys
raw=sys.stdin.read().strip()
if not raw:
    print('ERROR: empty API response')
    sys.exit(1)
d=json.loads(raw)
if d.get('stat') == 'ok':
    monitors = d.get('monitors', [])
    print(f'Total monitors: {len(monitors)}')
    for m in monitors:
        status_map = {0:'paused', 1:'not checked', 2:'up', 8:'seems down', 9:'down'}
        status = status_map.get(m['status'], 'unknown')
        print(f'  [{status:10}] {m[\"friendly_name\"]} -> {m[\"url\"]}')
else:
    print('ERROR:', d.get('error', d))
"
}

create_monitor() {
    local URL="$1"
    local NAME
    NAME=$(echo "$URL" | sed 's|https://||')

    RESULT=$(curl -s -X POST "https://api.uptimerobot.com/v2/newMonitor" \
        -H "Content-Type: application/x-www-form-urlencoded" \
        --data-urlencode "api_key=$API_KEY" \
        --data-urlencode "friendly_name=$NAME" \
        --data-urlencode "url=$URL" \
        --data-urlencode "type=1" \
        --data-urlencode "interval=300" \
        --data-urlencode "alert_contacts=8408543")

    SUCCESS=$(echo "$RESULT" | python3 -c "import json,sys; d=json.load(sys.stdin); print(d.get('stat','fail'))" 2>/dev/null)
    if [ "$SUCCESS" = "ok" ]; then
        log "  CREATED: $NAME"
    else
        ERR=$(echo "$RESULT" | python3 -c "import json,sys; d=json.load(sys.stdin); print(d.get('error',{}).get('message','unknown'))" 2>/dev/null)
        if echo "$ERR" | grep -qi "already"; then
            log "  EXISTS:  $NAME"
        else
            log "  FAILED:  $NAME — $ERR"
        fi
    fi
}

case "$MODE" in
    --list)
        list_monitors
        ;;
    --api-key)
        log "API key configured. Running full setup..."
        log "Creating monitors for ${#DOMAINS[@]} domains..."
        for DOMAIN in "${DOMAINS[@]}"; do
            create_monitor "$DOMAIN"
        done
        echo ""
        list_monitors
        ;;
    --register)
        log "Creating monitors for ${#DOMAINS[@]} domains..."
        for DOMAIN in "${DOMAINS[@]}"; do
            create_monitor "$DOMAIN"
        done
        echo ""
        list_monitors
        ;;
    *)
        if [ -n "$API_KEY" ]; then
            log "Running monitor registration..."
            for DOMAIN in "${DOMAINS[@]}"; do
                create_monitor "$DOMAIN"
            done
            list_monitors
        else
            echo "Usage:"
            echo "  uptime-monitor-setup --api-key <KEY>   # Configure and register all monitors"
            echo "  uptime-monitor-setup --list            # List current monitors"
            echo "  uptime-monitor-setup --register        # Register monitors (key already saved)"
        fi
        ;;
esac
