#!/usr/bin/env bash

set -Eeuo pipefail

usage() {
    echo "Usage: $0 <app01|app02> <run_id> <postclone|active|rollback>" >&2
    exit 2
}

[[ $# -eq 3 ]] || usage
NODE_KEY=$1
RUN_ID=$2
EXPECTED_STATE=$3

case "$NODE_KEY" in
    app01) QID=q111; EXPECTED_HOST=sqjcapp01; EXPECTED_IP=10.2.203.104 ;;
    app02)
        EXPECTED_HOST=sqjcapp02
        EXPECTED_IP=10.2.203.105
        case "$EXPECTED_STATE" in
            postclone) QID=q110 ;;
            active|rollback) QID=q112 ;;
            *) usage ;;
        esac
        ;;
    *) usage ;;
esac
case "$EXPECTED_STATE" in postclone|active|rollback) ;; *) usage ;; esac
[[ "$RUN_ID" =~ ^${QID}-[A-Za-z0-9+_.:-]+$ ]] || {
    echo "ERROR: run_id must begin with ${QID}-" >&2
    exit 2
}
[[ $(id -u) -eq 0 ]] || { echo 'ERROR: root required' >&2; exit 1; }
[[ $(hostname -s) == "$EXPECTED_HOST" ]] || { echo 'ERROR: hostname mismatch' >&2; exit 1; }
ip -o -4 addr show scope global | grep -Eq "(^|[[:space:]])${EXPECTED_IP//./\\.}/" || {
    echo 'ERROR: expected IPv4 missing' >&2
    exit 1
}

EVIDENCE_DIR="/var/backups/zhct-${QID}/evidence/${RUN_ID}-verify"
[[ ! -e "$EVIDENCE_DIR" && ! -L "$EVIDENCE_DIR" ]] || {
    echo "ERROR: evidence directory already exists: $EVIDENCE_DIR" >&2
    exit 1
}
install -d -m 0700 -o root -g root "$EVIDENCE_DIR"
exec > >(tee "$EVIDENCE_DIR/execution.log") 2>&1

finish() {
    rc=$?
    trap - EXIT
    set +e
    {
        echo "qid=$QID"
        echo "run_id=${RUN_ID}-verify"
        echo "source_run_id=$RUN_ID"
        echo "node_key=$NODE_KEY"
        echo "expected_state=$EXPECTED_STATE"
        echo "exit_code=$rc"
        if [[ $rc -eq 0 ]]; then echo "result=PASS"; else echo "result=FAIL"; fi
    } >"$EVIDENCE_DIR/result.env"
    chmod 0600 "$EVIDENCE_DIR/result.env"
    echo "APP_VERIFY_EXIT_CODE=$rc"
    if [[ $rc -eq 0 ]]; then echo APP_VERIFY_RESULT=PASS; else echo APP_VERIFY_RESULT=FAIL; fi
    echo APP_VERIFY_END
    exit "$rc"
}
trap finish EXIT

echo APP_VERIFY_BEGIN
date '+%Y-%m-%dT%H:%M:%S%z'
echo "QID=$QID NODE_KEY=$NODE_KEY EXPECTED_HOST=$EXPECTED_HOST EXPECTED_IP=$EXPECTED_IP EXPECTED_STATE=$EXPECTED_STATE"

grep -Fxq 'ROLE=app' /etc/zhct/node.env
grep -Fxq "NODE_KEY=$NODE_KEY" /etc/zhct/node.env
grep -Fxq "NODE_IP=$EXPECTED_IP" /etc/zhct/node.env
grep -Fxq "NODE_NAME=$EXPECTED_HOST" /etc/zhct/node.env
[[ -s /etc/machine-id ]]
[[ -s /etc/ssh/ssh_host_ed25519_key ]]

/usr/local/nginx/sbin/nginx -t
/usr/local/php7.3/sbin/php-fpm -tt --fpm-config /usr/local/php7.3/etc/php-fpm.conf
/usr/local/php7.4/sbin/php-fpm -tt --fpm-config /usr/local/php7.4/etc/php-fpm.conf
/usr/local/sbin/singleton-state-check.sh \
    --node "$NODE_KEY" \
    --config /etc/supervisor/conf.d/sanquan.conf \
    --cron /etc/cron.d/zhct-sanquan

if [[ "$EXPECTED_STATE" == active ]]; then
    for unit in php-fpm73.service php-fpm74.service nginx.service; do
        enabled=$(systemctl is-enabled "$unit" 2>/dev/null || true)
        active=$(systemctl is-active "$unit" 2>/dev/null || true)
        echo "$unit enabled=$enabled active=$active"
        [[ "$enabled" == enabled && "$active" == active ]]
    done
    ss -H -ltn | awk '$4 ~ /:8081$/ {found=1} END {exit !found}'
    ss -H -ltn | awk '$4 ~ /^127\\.0\\.0\\.1:18081$/ {found=1} END {exit !found}'
else
    for unit in nginx.service php-fpm73.service php-fpm74.service; do
        enabled=$(systemctl is-enabled "$unit" 2>/dev/null || true)
        active=$(systemctl is-active "$unit" 2>/dev/null || true)
        echo "$unit enabled=$enabled active=$active"
        [[ "$enabled" == disabled && "$active" == inactive ]]
    done
    ! ss -H -lntup | grep -Eq ':(8081|18081)([[:space:]]|$)'
    ! pgrep -x nginx
    ! pgrep -x php-fpm
fi

for unit in supervisor.service crond.service; do
    enabled=$(systemctl is-enabled "$unit" 2>/dev/null || true)
    active=$(systemctl is-active "$unit" 2>/dev/null || true)
    echo "$unit enabled=$enabled active=$active"
    [[ "$enabled" == disabled && "$active" == inactive ]]
done
! pgrep -x supervisord
! pgrep -x crond
! pgrep -x php

echo APP_VERIFY_EVIDENCE_DIR="$EVIDENCE_DIR"
