#!/usr/bin/env bash
# liderra-healthcheck.sh — проверка здоровья портала + email-алёрт на kdv1@bk.ru.
# Cron: каждые 2 минуты.
# Логика: 2 подряд провала (~4 мин даунтайма) → DOWN-алёрт; первый успех после DOWN → UP-алёрт.
set -u

ALERT_TO="kdv1@bk.ru"
URL="https://127.0.0.1/"
HOST_HDR="liderra.ru"
STATE_DIR="/var/lib/liderra"
STATE_FILE="$STATE_DIR/healthcheck.state"
LOG="/var/log/liderra-healthcheck.log"

DOWN_THRESHOLD=2   # подряд провалов до DOWN-алёрта
TIMEOUT=10

mkdir -p "$STATE_DIR" 2>/dev/null || true
touch "$STATE_FILE" "$LOG" 2>/dev/null || true

# Текущее состояние: DOWN_COUNT и LAST_STATE (up|down)
DOWN_COUNT=$(awk -F= '/^down_count=/{print $2}' "$STATE_FILE" 2>/dev/null)
DOWN_COUNT="${DOWN_COUNT:-0}"
LAST_STATE=$(awk -F= '/^last_state=/{print $2}' "$STATE_FILE" 2>/dev/null)
LAST_STATE="${LAST_STATE:-up}"

HTTP_CODE=$(curl -sS -k --max-time "$TIMEOUT" -H "Host: $HOST_HDR" -o /dev/null -w "%{http_code}" "$URL" 2>/dev/null || echo "000")
NOW=$(date '+%Y-%m-%d %H:%M:%S')

write_state() {
    cat > "$STATE_FILE" <<EOF
down_count=$1
last_state=$2
last_check=$NOW
last_code=$HTTP_CODE
EOF
}

send_mail() {
    local subj="$1"
    local body="$2"
    {
        printf 'Subject: %s\n' "$subj"
        printf 'From: verify@liderra.ru\n'
        printf 'To: %s\n' "$ALERT_TO"
        printf 'MIME-Version: 1.0\n'
        printf 'Content-Type: text/plain; charset=utf-8\n\n'
        printf '%s\n' "$body"
    } | msmtp -a yandex "$ALERT_TO" >> "$LOG" 2>&1
}

# Считаем 5xx, 000 (timeout/refused) и любые сетевые ошибки как «провал».
# 200/301/302/401/403 — портал отвечает (даже 401 — это «жив»).
if [[ "$HTTP_CODE" =~ ^[23] ]] || [[ "$HTTP_CODE" =~ ^(301|302|401|403)$ ]]; then
    STATE="up"
else
    STATE="down"
fi

if [[ "$STATE" == "down" ]]; then
    DOWN_COUNT=$((DOWN_COUNT + 1))
    echo "[$NOW] DOWN code=$HTTP_CODE count=$DOWN_COUNT" >> "$LOG"
    if [[ "$DOWN_COUNT" -ge "$DOWN_THRESHOLD" ]] && [[ "$LAST_STATE" == "up" ]]; then
        TAIL_ERR=$(grep -E 'production\.ERROR' /var/www/liderra/app/storage/logs/laravel.log 2>/dev/null | tail -3 | cut -c1-400)
        NGX=$(tail -5 /var/log/nginx/error.log 2>/dev/null)
        send_mail "[Лидерра ПАДЕНИЕ] liderra.ru недоступен — HTTP $HTTP_CODE" "Портал liderra.ru недоступен.

Время: $NOW
HTTP-код: $HTTP_CODE
Провалов подряд: $DOWN_COUNT (порог $DOWN_THRESHOLD)

Последние ошибки Laravel:
$TAIL_ERR

Последние строки nginx error.log:
$NGX

Сервер: ssh ubuntu@111.88.246.137
"
        write_state "$DOWN_COUNT" "down"
    else
        write_state "$DOWN_COUNT" "$LAST_STATE"
    fi
else
    if [[ "$LAST_STATE" == "down" ]]; then
        echo "[$NOW] RECOVERED code=$HTTP_CODE" >> "$LOG"
        send_mail "[Лидерра восстановлен] liderra.ru снова работает — HTTP $HTTP_CODE" "Портал liderra.ru снова отвечает.

Время восстановления: $NOW
HTTP-код: $HTTP_CODE
"
    fi
    write_state 0 "up"
fi
