#!/bin/bash
# WhatsApp/Evolution API Health Monitor
# Runs every 5 minutes via cron, checks status and sends alerts

set -e
PATH="/usr/local/bin:/usr/bin:/bin:$HOME/.local/bin"

# ─── Config ───────────────────────────────────────
EVO_URL="http://127.0.0.1:4500"
EVO_API_KEY="429683C4C977415CAAFCCE10F7D57E11"
INSTANCE_NAME="wa_f31ba15c-81cd-46d2-a2e5-9b9f88114bf5_1782087848147"
HALA_URL="http://127.0.0.1:5003"
PM2_APP_NAME="halavoice"
LOG_FILE="/home/ashraffarid2010/halavoice.store/monitor-whatsapp.log"
STATE_FILE="/home/ashraffarid2010/halavoice.store/monitor-state.json"
# ─── Alert recipients (Telegram) ──────────────────
TELEGRAM_BOT_TOKEN=""
TELEGRAM_CHAT_ID=""
# ─── Alert via Salla/Email ────────────────────────
ALERT_EMAIL="ashraf@halavoice.store"

# ─── Rotate log (keep last 200 lines) ─────────────
if [ -f "$LOG_FILE" ] && [ "$(wc -l < "$LOG_FILE")" -gt 200 ]; then
  tail -n 100 "$LOG_FILE" > "$LOG_FILE.tmp" && mv "$LOG_FILE.tmp" "$LOG_FILE"
fi

log() {
  echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
}

load_state() {
  if [ -f "$STATE_FILE" ]; then
    cat "$STATE_FILE"
  else
    echo '{"evo_was_down":false,"instance_was_down":false,"hala_was_down":false,"pm2_was_down":false}'
  fi
}

save_state() {
  echo "$1" > "$STATE_FILE"
}

send_alert() {
  local subject="$1"
  local message="$2"
  log "ALERT: $subject - $message"

  # Send email (if mail command available)
  if command -v mail &>/dev/null; then
    echo "$message" | mail -s "$subject" "$ALERT_EMAIL" 2>/dev/null || true
  fi

  # Send Telegram (if configured)
  if [ -n "$TELEGRAM_BOT_TOKEN" ] && [ -n "$TELEGRAM_CHAT_ID" ]; then
    local encoded_msg
    encoded_msg=$(echo -e "$subject\n$message" | python3 -c "import urllib.parse; print(urllib.parse.quote(sys.stdin.read()))" 2>/dev/null || echo "$subject: $message")
    curl -s -o /dev/null "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage?chat_id=${TELEGRAM_CHAT_ID}&text=${encoded_msg}" 2>/dev/null || true
  fi
}

now() {
  date +%s
}

# ─── Load previous state ──────────────────────────
state=$(load_state)
evo_was_down=$(echo "$state" | python3 -c "import json,sys; d=json.load(sys.stdin); print(d.get('evo_was_down','false'))")
instance_was_down=$(echo "$state" | python3 -c "import json,sys; d=json.load(sys.stdin); print(d.get('instance_was_down','false'))")
hala_was_down=$(echo "$state" | python3 -c "import json,sys; d=json.load(sys.stdin); print(d.get('hala_was_down','false'))")
pm2_was_down=$(echo "$state" | python3 -c "import json,sys; d=json.load(sys.stdin); print(d.get('pm2_was_down','false'))")

evo_is_down=false
instance_is_down=false
hala_is_down=false
pm2_is_down=false
alert_needed=false
alert_messages=""

# ─── 1. Check Evolution API ───────────────────────
evo_http=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout 10 "$EVO_URL/" 2>/dev/null || echo "000")
if [ "$evo_http" != "200" ]; then
  log "Evolution API DOWN (HTTP $evo_http)"
  evo_is_down=true

  # Try restart via systemd
  log "Attempting restart of evolution-api.service..."
  systemctl restart evolution-api.service 2>/dev/null || log "Failed to restart evolution-api.service (need sudo?)"

  if [ "$evo_was_down" = "false" ]; then
    alert_needed=true
    alert_messages+="❌ Evolution API DOWN - server returned HTTP $evo_http\n"
    # Wait and recheck
    sleep 5
    evo_http2=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout 10 "$EVO_URL/" 2>/dev/null || echo "000")
    alert_messages+="  → After restart attempt: HTTP $evo_http2\n"
  fi
else
  log "Evolution API OK"
fi

# ─── 2. Check WhatsApp instance connection ───────
if [ "$evo_http" = "200" ]; then
  inst_state=$(curl -s -H "apiKey: $EVO_API_KEY" --connect-timeout 10 "$EVO_URL/instance/connectionState/$INSTANCE_NAME" 2>/dev/null | python3 -c "import json,sys; d=json.load(sys.stdin); print(d.get('instance',{}).get('state','unknown'))" 2>/dev/null || echo "unknown")

  if [ "$inst_state" != "open" ]; then
    log "WhatsApp instance NOT connected (state: $inst_state)"
    instance_is_down=true

    # Try to reconnect
    log "Attempting reconnect via Evolution API..."
    reconnect_result=$(curl -s -X POST -H "apiKey: $EVO_API_KEY" "$EVO_URL/instance/connect/$INSTANCE_NAME" 2>/dev/null || echo "failed")
    log "Reconnect result: $reconnect_result"

    if [ "$instance_was_down" = "false" ]; then
      alert_needed=true
      alert_messages+="⚠️ WhatsApp instance '$INSTANCE_NAME' disconnected (state: $inst_state)\n"
      alert_messages+="  → Reconnect attempted\n"
    fi
  else
    log "WhatsApp instance connected OK"
  fi
fi

# ─── 3. Check HalaVoice web server ───────────────
hala_http=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout 10 "$HALA_URL/" 2>/dev/null || echo "000")
if [ "$hala_http" != "200" ]; then
  log "HalaVoice web server DOWN (HTTP $hala_http)"
  hala_is_down=true

  # Try restart via PM2
  log "Attempting restart via PM2..."
  pm2 restart "$PM2_APP_NAME" 2>/dev/null || log "PM2 restart failed"

  if [ "$hala_was_down" = "false" ]; then
    alert_needed=true
    alert_messages+="🔴 HalaVoice web server DOWN - HTTP $hala_http\n"
    alert_messages+="  → PM2 restart attempted\n"
  fi
else
  log "HalaVoice web server OK"
fi

# ─── 4. Check PM2 processes ──────────────────────
pm2_status=$(pm2 list 2>/dev/null | grep -q "halavoice.*online" && echo "online" || echo "offline")

if [ "$pm2_status" != "online" ]; then
  log "PM2 process '$PM2_APP_NAME' NOT online (status: $pm2_status)"
  pm2_is_down=true
  if [ "$pm2_was_down" = "false" ]; then
    alert_needed=true
    alert_messages+="🟠 PM2 process '$PM2_APP_NAME' is not online\n"
    pm2 restart "$PM2_APP_NAME" 2>/dev/null || true
    alert_messages+="  → Restart attempted\n"
  fi
else
  log "PM2 '$PM2_APP_NAME' online"
fi

# ─── Send alerts ──────────────────────────────────
if [ "$alert_needed" = "true" ]; then
  alert_msg="HalaVoice Monitor Alert ($(hostname))\n━━━━━━━━━━━━━━━━━━━━━━\n$alert_messages"
  send_alert "HalaVoice Monitor Alert" "$(echo -e "$alert_msg")"
fi

# ─── Save state ───────────────────────────────────
new_state="{\"evo_was_down\":$evo_is_down,\"instance_was_down\":$instance_is_down,\"hala_was_down\":$hala_is_down,\"pm2_was_down\":$pm2_is_down}"
save_state "$new_state"

# ─── Health endpoint update (for dashboard) ───────
if [ "$evo_is_down" = "false" ] && [ "$instance_is_down" = "false" ] && [ "$hala_is_down" = "false" ]; then
  overall="healthy"
else
  overall="degraded"
fi

echo "WhatsApp Health Monitor: overall=$overall, evo=$evo_http, instance=$inst_state, hala=$hala_http, pm2=$pm2_status"
