#!/usr/bin/env bash
# ANDANILY INTERACTIVE - DIAGNOSTIC 02
# Final preflight before Paket 00 Foundation.
# Non-destructive. Temporary web probe is removed automatically.

set -u
umask 077

ROOT="/home/smansin1/andanily"
DOMAIN="andanily.my.id"
STAMP="$(date '+%Y%m%d-%H%M%S' 2>/dev/null || echo unknown-time)"
OUTBASE="$ROOT/diagnostics"
OUTDIR="$OUTBASE/diag-02-$STAMP"
REPORT="$OUTDIR/ANDANILY-DIAG-02-REPORT.txt"
SUMMARY="$OUTDIR/ANDANILY-DIAG-02-SUMMARY.txt"
RESULT_ZIP="$ROOT/ANDANILY-DIAG-02-RESULT-$STAMP.zip"
PROBE_NAME=".andanily-preflight-$STAMP.php"
PROBE_PATH="$ROOT/$PROBE_NAME"

mkdir -p "$OUTDIR" || exit 1
touch "$REPORT" "$SUMMARY" || exit 1

log(){ printf '%s\n' "$*" | tee -a "$REPORT"; }
sum(){ printf '%s\n' "$*" | tee -a "$SUMMARY"; }
section(){ log ""; log "================================================================"; log "$1"; log "================================================================"; }
have(){ command -v "$1" >/dev/null 2>&1; }

cleanup() {
  rm -f "$PROBE_PATH" 2>/dev/null || true
}
trap cleanup EXIT INT TERM

section "ANDANILY INTERACTIVE - DIAGNOSTIC 02 FINAL PREFLIGHT"
log "Timestamp : $STAMP"
log "Root      : $ROOT"
log "Domain    : $DOMAIN"
log "User      : $(whoami 2>/dev/null || echo unknown)"

CLI_PHP="unknown"
CLI_FILEINFO="unknown"
CLI_REQUIRED="unknown"

section "1. CLI PHP"
if have php; then
  CLI_PHP="$(php -r 'echo PHP_VERSION;' 2>/dev/null || echo unknown)"
  CLI_FILEINFO="$(php -r 'echo extension_loaded("fileinfo") ? "yes" : "no";' 2>/dev/null || echo unknown)"
  log "PHP CLI version     : $CLI_PHP"
  log "CLI fileinfo        : $CLI_FILEINFO"

  req=(ctype curl dom fileinfo mbstring openssl pdo tokenizer xml)
  missing=()
  for ext in "${req[@]}"; do
    php -m 2>/dev/null | grep -qiE "^${ext}$" || missing+=("$ext")
  done
  if [ "${#missing[@]}" -eq 0 ]; then
    CLI_REQUIRED="pass"
    log "Required extensions : PASS"
  else
    CLI_REQUIRED="fail"
    log "Required extensions : FAIL"
    log "Missing             : ${missing[*]}"
  fi
else
  log "PHP CLI not found."
fi

section "2. COMPOSER"
COMPOSER_STATUS="missing"
COMPOSER_VERSION="unknown"
if have composer; then
  COMPOSER_STATUS="present"
  COMPOSER_VERSION="$(composer --version 2>/dev/null | head -n1)"
  log "Composer            : $COMPOSER_VERSION"
else
  log "Composer            : not found"
fi

section "3. WEB PHP / LIMITS / EXTENSIONS"
cat >"$PROBE_PATH" <<'PHP'
<?php
header('Content-Type: application/json; charset=utf-8');
header('Cache-Control: no-store');
$extensions = ['ctype','curl','dom','fileinfo','mbstring','openssl','pdo','pdo_mysql','tokenizer','xml','zip','gd','imagick','sodium'];
$out = [
  'php_version' => PHP_VERSION,
  'php_sapi' => PHP_SAPI,
  'document_root' => $_SERVER['DOCUMENT_ROOT'] ?? null,
  'file_uploads' => ini_get('file_uploads'),
  'memory_limit' => ini_get('memory_limit'),
  'upload_max_filesize' => ini_get('upload_max_filesize'),
  'post_max_size' => ini_get('post_max_size'),
  'max_execution_time' => ini_get('max_execution_time'),
  'max_input_time' => ini_get('max_input_time'),
  'extensions' => [],
];
foreach ($extensions as $ext) {
  $out['extensions'][$ext] = extension_loaded($ext);
}
echo json_encode($out, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
PHP
chmod 600 "$PROBE_PATH" 2>/dev/null || true

WEB_STATUS="fail"
WEB_PHP="unknown"
WEB_FILEINFO="unknown"
WEB_DOCROOT="unknown"
WEB_UPLOAD="unknown"
WEB_POST="unknown"
WEB_MEMORY="unknown"
WEB_EXEC="unknown"

if have curl; then
  BODY="$OUTDIR/web-preflight.json"
  CODE="$(curl -k -sS --max-time 10 -o "$BODY" -w '%{http_code}' "https://$DOMAIN/$PROBE_NAME" 2>/dev/null || echo 000)"
  log "HTTP status         : $CODE"
  if [ "$CODE" = "200" ] && [ -s "$BODY" ]; then
    WEB_STATUS="pass"
    log "Web probe response:"
    cat "$BODY" >>"$REPORT"
    log ""
    if have php; then
      WEB_PHP="$(php -r '$j=json_decode(file_get_contents($argv[1]),true); echo $j["php_version"]??"unknown";' "$BODY" 2>/dev/null || echo unknown)"
      WEB_FILEINFO="$(php -r '$j=json_decode(file_get_contents($argv[1]),true); echo !empty($j["extensions"]["fileinfo"])?"yes":"no";' "$BODY" 2>/dev/null || echo unknown)"
      WEB_DOCROOT="$(php -r '$j=json_decode(file_get_contents($argv[1]),true); echo $j["document_root"]??"unknown";' "$BODY" 2>/dev/null || echo unknown)"
      WEB_UPLOAD="$(php -r '$j=json_decode(file_get_contents($argv[1]),true); echo $j["upload_max_filesize"]??"unknown";' "$BODY" 2>/dev/null || echo unknown)"
      WEB_POST="$(php -r '$j=json_decode(file_get_contents($argv[1]),true); echo $j["post_max_size"]??"unknown";' "$BODY" 2>/dev/null || echo unknown)"
      WEB_MEMORY="$(php -r '$j=json_decode(file_get_contents($argv[1]),true); echo $j["memory_limit"]??"unknown";' "$BODY" 2>/dev/null || echo unknown)"
      WEB_EXEC="$(php -r '$j=json_decode(file_get_contents($argv[1]),true); echo $j["max_execution_time"]??"unknown";' "$BODY" 2>/dev/null || echo unknown)"
    fi
  fi
else
  log "curl unavailable."
fi

rm -f "$PROBE_PATH" 2>/dev/null || true
log "Temporary web probe removed: YES"

section "4. DOCUMENT ROOT SAFETY"
PUBLIC_ROOT_STATUS="note"
log "Current web document root: $WEB_DOCROOT"
if [ "$WEB_DOCROOT" = "$ROOT" ]; then
  log "NOTE: Current domain points to application root."
  log "Before Laravel goes live, interactive.andanily.my.id should point to:"
  log "$ROOT/public"
  PUBLIC_ROOT_STATUS="needs-change-before-production"
elif [ "$WEB_DOCROOT" = "$ROOT/public" ]; then
  log "Document root already points to Laravel public directory."
  PUBLIC_ROOT_STATUS="ready"
else
  log "Document root differs from expected paths; review before deployment."
  PUBLIC_ROOT_STATUS="review"
fi

section "5. DEPLOYMENT TOOLS"
for cmd in unzip zip git curl openssl gs convert identify; do
  if have "$cmd"; then
    log "$cmd : $(command -v "$cmd")"
  else
    log "$cmd : missing"
  fi
done

section "6. PDF CONVERSION RECONFIRMATION"
PDF_STATUS="fail"
TMPPDF="$OUTDIR/preflight.pdf"
TMPPS="$OUTDIR/preflight.ps"
TMPWEBP="$OUTDIR/preflight.webp"

cat >"$TMPPS" <<'PS'
%!PS-Adobe-3.0
%%Pages: 1
%%BoundingBox: 0 0 720 405
/Helvetica-Bold findfont 26 scalefont setfont
72 300 moveto
(ANDANILY PREFLIGHT) show
showpage
PS

if have gs && have convert; then
  if gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile="$TMPPDF" "$TMPPS" >/dev/null 2>&1; then
    if convert -density 120 "$TMPPDF[0]" -background white -alpha remove -resize '1600x900>' "$TMPWEBP" >/dev/null 2>&1; then
      PDF_STATUS="pass"
      log "PDF -> WebP conversion: PASS"
      identify "$TMPWEBP" >>"$REPORT" 2>&1 || true
    else
      log "PDF -> WebP conversion: FAIL"
    fi
  else
    log "Synthetic PDF generation: FAIL"
  fi
else
  log "Ghostscript/ImageMagick missing."
fi

section "7. FINAL READINESS"
FINAL="PASS"
BLOCKERS=()

case "$CLI_PHP" in
  8.3.*|8.4.*|8.5.*) ;;
  *) FINAL="FAIL"; BLOCKERS+=("CLI PHP is not >= 8.3") ;;
esac

case "$WEB_PHP" in
  8.3.*|8.4.*|8.5.*) ;;
  *) FINAL="FAIL"; BLOCKERS+=("Web PHP is not >= 8.3") ;;
esac

[ "$CLI_FILEINFO" = "yes" ] || { FINAL="FAIL"; BLOCKERS+=("CLI fileinfo is disabled"); }
[ "$WEB_FILEINFO" = "yes" ] || { FINAL="FAIL"; BLOCKERS+=("Web fileinfo is disabled"); }
[ "$CLI_REQUIRED" = "pass" ] || { FINAL="FAIL"; BLOCKERS+=("Required PHP extensions missing"); }
[ "$COMPOSER_STATUS" = "present" ] || { FINAL="FAIL"; BLOCKERS+=("Composer missing"); }
[ "$PDF_STATUS" = "pass" ] || { FINAL="FAIL"; BLOCKERS+=("PDF conversion unavailable"); }

section "8. SUMMARY"
sum "ANDANILY INTERACTIVE - DIAGNOSTIC 02 FINAL PREFLIGHT"
sum "Generated              : $STAMP"
sum ""
sum "FINAL READINESS        : $FINAL"
sum ""
sum "CLI PHP                : $CLI_PHP"
sum "Web PHP                : $WEB_PHP"
sum "CLI fileinfo           : $CLI_FILEINFO"
sum "Web fileinfo           : $WEB_FILEINFO"
sum "Composer               : $COMPOSER_VERSION"
sum "PDF -> WebP            : $PDF_STATUS"
sum ""
sum "Web document root      : $WEB_DOCROOT"
sum "Document-root status   : $PUBLIC_ROOT_STATUS"
sum ""
sum "memory_limit           : $WEB_MEMORY"
sum "upload_max_filesize    : $WEB_UPLOAD"
sum "post_max_size          : $WEB_POST"
sum "max_execution_time     : $WEB_EXEC"
sum ""
if [ "$FINAL" = "FAIL" ]; then
  sum "BLOCKERS:"
  for b in "${BLOCKERS[@]}"; do
    sum "- $b"
  done
else
  sum "All mandatory preflight checks passed."
  sum "Server is ready for ANDANILY Paket 00 Foundation."
fi

cp "$SUMMARY" "$OUTDIR/README-FIRST.txt" 2>/dev/null || true

section "9. RESULT PACKAGE"
if have zip; then
  (cd "$OUTBASE" && zip -qr "$RESULT_ZIP" "$(basename "$OUTDIR")")
  if [ -f "$RESULT_ZIP" ]; then
    log "Result package: $RESULT_ZIP"
    echo ""
    echo "=============================================================="
    echo "DIAGNOSTIC 02 COMPLETE"
    echo "FINAL READINESS: $FINAL"
    echo "Download and send back:"
    echo "$RESULT_ZIP"
    echo "=============================================================="
    exit 0
  fi
fi

echo "Diagnostic complete but ZIP result could not be created."
echo "Folder: $OUTDIR"
