#!/usr/bin/env bash
set -Eeuo pipefail
umask 077

RUN_ID=${1:-$(date '+%Y%m%dT%H%M%S%z')}
Q061_RUN=20260727T150528+0800
EVIDENCE_DIR="/var/backups/zhct-q062/$RUN_ID"
Q061_EVIDENCE="/var/backups/zhct-q061/$Q061_RUN"
TEMP_ROOT="/var/tmp/zhct-q062-mysql80-$RUN_ID"
TEMP_PID=

die() { printf 'ERROR: %s\n' "$*" >&2; return 1; }
record() { printf '%s=%s\n' "$1" "$2" >>"$EVIDENCE_DIR/result.env"; }

cleanup_failure() {
  local rc=$?
  trap - ERR INT TERM
  set +e
  printf 'failure_exit=%s\n' "$rc" >>"$EVIDENCE_DIR/result.env"
  if [[ -n "${TEMP_PID:-}" ]] && kill -0 "$TEMP_PID" 2>/dev/null; then
    if tr '\0' ' ' <"/proc/$TEMP_PID/cmdline" | grep -Fq -- "$TEMP_ROOT"; then
      kill -TERM "$TEMP_PID"
      for _ in {1..30}; do kill -0 "$TEMP_PID" 2>/dev/null || break; sleep 1; done
    fi
  fi
  pgrep -a -x mysqld >"$EVIDENCE_DIR/failure-mysqld-processes.txt" 2>&1
  ss -lntup >"$EVIDENCE_DIR/failure-listeners.txt" 2>&1
  printf 'temporary_verify_result=FAIL\n' >>"$EVIDENCE_DIR/result.env"
  printf 'Q062_MYSQL80_VERIFY_FAILED run_id=%s evidence=%s\n' "$RUN_ID" "$EVIDENCE_DIR" >&2
  exit "$rc"
}

[[ $(id -u) -eq 0 ]] || die "root required"
[[ "$RUN_ID" =~ ^[0-9]{8}T[0-9]{6}[+-][0-9]{4}$ ]] || die "invalid run id"
[[ ! -e "$EVIDENCE_DIR" ]] || die "evidence already exists: $EVIDENCE_DIR"
install -d -m 0700 "$EVIDENCE_DIR"
printf 'run_id=%s\nstarted_at=%s\n' "$RUN_ID" "$(date --iso-8601=seconds)" >"$EVIDENCE_DIR/result.env"

[[ $(hostname -s | tr '[:upper:]' '[:lower:]') == sqjcdb01 ]] || die "wrong hostname"
ip -o -4 addr show scope global | awk '{print $4}' | cut -d/ -f1 | grep -Fxq 10.2.208.106 ||
  die "expected IP missing"
grep -Fxq 'install_result=PASS' "$Q061_EVIDENCE/result.env" || die "Q061 PASS evidence missing"
grep -Fxq 'temporary_mysql_stopped=PASS' "$Q061_EVIDENCE/result.env"
grep -Fxq 'service_activation=NOT_PERFORMED' "$Q061_EVIDENCE/result.env"
[[ -x /opt/mysql/8.0.46/bin/mysqld && -x /opt/mysql/8.0.46/bin/mysql ]] ||
  die "MySQL 8.0 binaries missing"

for unit in mysql56.service mysql80.service mysql-health56.service mysql-health80.service; do
  [[ $(systemctl is-enabled "$unit" 2>/dev/null || true) == disabled ]] ||
    die "unit not disabled: $unit"
  ! systemctl is-active --quiet "$unit" || die "unit active: $unit"
done
! pgrep -x mysqld >/dev/null || die "mysqld already running"
ss -lntup >"$EVIDENCE_DIR/listeners-before.txt"
! grep -Eq ':(3306|3308|9201|9202|33060)([[:space:]]|$)' "$EVIDENCE_DIR/listeners-before.txt" ||
  die "target listener exists"
for path in /data/mysql56 /data/mysql80; do
  ! find "$path" -mindepth 1 ! -type d -print -quit | grep -q . ||
    die "formal data directory contains files: $path"
done
df -Pk / >"$EVIDENCE_DIR/root-disk-before.txt"
(( $(df -Pk / | awk 'NR==2 {print $4}') >= 9011200 )) || die "root free space below 8.8 GiB"

trap cleanup_failure ERR INT TERM
install -d -m 0750 -o mysql -g mysql "$TEMP_ROOT/data" "$TEMP_ROOT/run" "$TEMP_ROOT/log"
/opt/mysql/8.0.46/bin/mysqld --no-defaults --initialize-insecure \
  --basedir=/opt/mysql/8.0.46 --datadir="$TEMP_ROOT/data" --user=mysql \
  >"$EVIDENCE_DIR/mysql80-init.log" 2>&1

/opt/mysql/8.0.46/bin/mysqld --no-defaults \
  --basedir=/opt/mysql/8.0.46 --datadir="$TEMP_ROOT/data" --user=mysql \
  --bind-address=127.0.0.1 --port=3308 --mysqlx=OFF \
  --socket="$TEMP_ROOT/run/mysql.sock" --pid-file="$TEMP_ROOT/run/mysqld.pid" \
  --log-error="$TEMP_ROOT/log/error.log" --skip-log-bin \
  >"$EVIDENCE_DIR/mysql80-start.console.log" 2>&1 &
TEMP_PID=$!
for _ in {1..90}; do
  /opt/mysql/8.0.46/bin/mysqladmin --no-defaults --user=root \
    --socket="$TEMP_ROOT/run/mysql.sock" ping >/dev/null 2>&1 && break
  kill -0 "$TEMP_PID" 2>/dev/null || die "temporary mysqld exited"
  sleep 1
done
/opt/mysql/8.0.46/bin/mysqladmin --no-defaults --user=root \
  --socket="$TEMP_ROOT/run/mysql.sock" ping |
  tee "$EVIDENCE_DIR/mysql80-ping.txt" | grep -Fq 'mysqld is alive'
ss -lntp | tee "$EVIDENCE_DIR/mysql80-listener.txt" | grep -Eq '127[.]0[.]0[.]1:3308'
! ss -lntp | grep -Eq ':(33060)([[:space:]]|$)' || die "unexpected MySQL X listener"
/opt/mysql/8.0.46/bin/mysql --no-defaults --user=root \
  --socket="$TEMP_ROOT/run/mysql.sock" -NBe \
  "CREATE DATABASE q062_acceptance; CREATE TABLE q062_acceptance.probe(id INT PRIMARY KEY, value VARCHAR(16)); INSERT INTO q062_acceptance.probe VALUES(1,'q062-pass'); SELECT CONCAT(id,':',value) FROM q062_acceptance.probe; DROP DATABASE q062_acceptance;" |
  tee "$EVIDENCE_DIR/mysql80-sql-test.txt" | grep -Fxq '1:q062-pass'
/opt/mysql/8.0.46/bin/mysqladmin --no-defaults --user=root \
  --socket="$TEMP_ROOT/run/mysql.sock" shutdown
wait "$TEMP_PID"
TEMP_PID=
cp -a "$TEMP_ROOT/log/error.log" "$EVIDENCE_DIR/mysql80-error.log"
if grep -Eqi 'Permission denied|Cannot load component|Can.t open shared library' \
  "$EVIDENCE_DIR/mysql80-init.log" "$EVIDENCE_DIR/mysql80-start.console.log" \
  "$EVIDENCE_DIR/mysql80-error.log"; then
  die "MySQL 8.0 component or shared-library load error detected"
fi
case "$TEMP_ROOT" in
  /var/tmp/zhct-q062-mysql80-"$RUN_ID") rm -rf -- "$TEMP_ROOT" ;;
  *) die "refuse unsafe temporary cleanup path: $TEMP_ROOT" ;;
esac

pgrep -a -x mysqld >"$EVIDENCE_DIR/mysql-processes-after.txt" 2>&1 || true
[[ ! -s "$EVIDENCE_DIR/mysql-processes-after.txt" ]] || die "mysqld remains after verification"
ss -lntup >"$EVIDENCE_DIR/listeners-after.txt"
! grep -Eq ':(3306|3308|9201|9202|33060)([[:space:]]|$)' "$EVIDENCE_DIR/listeners-after.txt" ||
  die "target listener remains after verification"

record mysql80_temporary_initialize PASS
record mysql80_port_3308 PASS_LOOPBACK_TEMPORARY
record mysql80_sql_read_write PASS
record mysql80_x_listener DISABLED
record temporary_mysql_stopped PASS
record formal_data_initialized NOT_PERFORMED
record post_clone_execution NOT_PERFORMED
record service_activation NOT_PERFORMED
record completed_at "$(date --iso-8601=seconds)"
trap - ERR INT TERM
printf 'Q062_MYSQL80_TEMPORARY_VERIFY_OK\nrun_id=%s\nevidence=%s\n' "$RUN_ID" "$EVIDENCE_DIR"
