#!/usr/bin/env bash
# ANDANILY INTERACTIVE - DIAGNOSTIC 01
# Web PHP + PDF conversion verification
# Non-destructive except temporary probe/test files which are 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-01-$STAMP"
REPORT="$OUTDIR/ANDANILY-DIAG-01-REPORT.txt"
SUMMARY="$OUTDIR/ANDANILY-DIAG-01-SUMMARY.txt"
RESULT_ZIP="$ROOT/ANDANILY-DIAG-01-RESULT-$STAMP.zip"
PROBE_NAME=".andanily-probe-$STAMP.php"
PROBE_PATH="$ROOT/$PROBE_NAME"
TESTDIR="$OUTDIR/pdf-test"

mkdir -p "$OUTDIR" "$TESTDIR" || 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 01"
log "Timestamp : $STAMP"
log "Root      : $ROOT"
log "Domain    : $DOMAIN"
log "User      : $(whoami 2>/dev/null || echo unknown)"

section "1. PHP CLI / ALTERNATIVE BINARIES"
for p in php /usr/local/bin/php /opt/alt/php83/usr/bin/php /opt/cpanel/ea-php83/root/usr/bin/php /opt/cpanel/ea-php82/root/usr/bin/php /opt/cpanel/ea-php84/root/usr/bin/php; do
  if command -v "$p" >/dev/null 2>&1 || [ -x "$p" ]; then
    BIN="$(command -v "$p" 2>/dev/null || echo "$p")"
    log "$BIN"
    "$BIN" -v 2>&1 | head -n 2 >>"$REPORT"
    "$BIN" --ini 2>&1 | head -n 8 >>"$REPORT"
    log ""
  fi
done

section "2. CPANEL / PHP HANDLER INFORMATION"
if have uapi; then
  log "--- UAPI LangPHP php_get_vhost_versions ---"
  uapi --output=jsonpretty LangPHP php_get_vhost_versions >>"$REPORT" 2>&1 || true
  log ""
  log "--- UAPI DomainInfo single_domain_data ---"
  uapi --output=jsonpretty DomainInfo single_domain_data domain="$DOMAIN" >>"$REPORT" 2>&1 || true
  log ""
  log "--- UAPI Quota get_quota_info ---"
  uapi --output=jsonpretty Quota get_quota_info >>"$REPORT" 2>&1 || true
fi

if have selectorctl; then
  log ""
  log "--- CloudLinux PHP Selector current version ---"
  selectorctl --current --user="$(whoami)" >>"$REPORT" 2>&1 || true
  log ""
  log "--- CloudLinux PHP Selector enabled extensions ---"
  selectorctl --list-extensions --user="$(whoami)" >>"$REPORT" 2>&1 || true
fi

section "3. SAFE WEB PHP PROBE"
cat >"$PROBE_PATH" <<'PHP'
<?php
header('Content-Type: application/json; charset=utf-8');
header('Cache-Control: no-store');
$extensions = ['fileinfo','curl','mbstring','openssl','pdo','pdo_mysql','zip','gd','imagick','sodium','sockets','pcntl'];
$out = [
  'php_version' => PHP_VERSION,
  'php_sapi' => PHP_SAPI,
  'document_root' => $_SERVER['DOCUMENT_ROOT'] ?? null,
  'script_filename' => $_SERVER['SCRIPT_FILENAME'] ?? null,
  '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'),
  '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_PROBE_STATUS="unknown"
WEB_PHP_VERSION="unknown"
WEB_FILEINFO="unknown"
WEB_DOCROOT="unknown"

if have curl; then
  PROBE_URL="https://$DOMAIN/$PROBE_NAME"
  PROBE_BODY="$OUTDIR/web-probe.json"
  HTTP_CODE="$(curl -k -sS --max-time 10 -o "$PROBE_BODY" -w '%{http_code}' "$PROBE_URL" 2>/dev/null || echo 000)"
  log "Probe HTTP status : $HTTP_CODE"
  if [ "$HTTP_CODE" = "200" ] && [ -s "$PROBE_BODY" ]; then
    WEB_PROBE_STATUS="pass"
    log "Probe response:"
    cat "$PROBE_BODY" >>"$REPORT"
    log ""
    if have php; then
      WEB_PHP_VERSION="$(php -r '$j=json_decode(file_get_contents($argv[1]), true); echo $j["php_version"] ?? "unknown";' "$PROBE_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";' "$PROBE_BODY" 2>/dev/null || echo unknown)"
      WEB_DOCROOT="$(php -r '$j=json_decode(file_get_contents($argv[1]), true); echo $j["document_root"] ?? "unknown";' "$PROBE_BODY" 2>/dev/null || echo unknown)"
    fi
  else
    WEB_PROBE_STATUS="fail"
    log "Could not execute/read temporary web probe."
    [ -s "$PROBE_BODY" ] && { log "Response body:"; head -c 2000 "$PROBE_BODY" >>"$REPORT"; log ""; }
  fi
else
  log "curl unavailable; web probe skipped."
fi

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

section "4. IMAGE MAGICK / GHOSTSCRIPT CAPABILITY"
if have convert; then
  log "--- ImageMagick PDF/WEBP format support ---"
  convert -list format 2>/dev/null | grep -Ei '(^|[[:space:]])(PDF|WEBP)[[:space:]]' >>"$REPORT" || true
  log ""
  log "--- ImageMagick security policies relevant to PDF/PS/EPS/XPS ---"
  convert -list policy 2>/dev/null | grep -Ei -C 2 'PDF|PS|EPS|XPS|Ghostscript|coder' >>"$REPORT" || true
else
  log "convert not available."
fi

if have gs; then
  log ""
  log "Ghostscript version: $(gs --version 2>/dev/null || echo unknown)"
fi

section "5. REAL PDF -> WEBP CONVERSION TEST"
cat >"$TESTDIR/input.ps" <<'PS'
%!PS-Adobe-3.0
%%Pages: 1
%%BoundingBox: 0 0 720 405
/Helvetica-Bold findfont 30 scalefont setfont
72 300 moveto
(ANDANILY PDF TEST) show
/Helvetica findfont 18 scalefont setfont
72 250 moveto
(PDF to image conversion capability check.) show
showpage
PS

PDF_CREATED="no"
PDF_CONVERT="no"
WEBP_CREATED="no"
PNG_CREATED="no"

if have gs; then
  if gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile="$TESTDIR/input.pdf" "$TESTDIR/input.ps" >>"$REPORT" 2>&1; then
    PDF_CREATED="yes"
    log "Synthetic PDF creation: PASS"
  else
    log "Synthetic PDF creation: FAIL"
  fi
fi

if [ "$PDF_CREATED" = "yes" ] && have convert; then
  log ""
  log "--- Attempt PDF -> WEBP ---"
  if convert -density 120 "$TESTDIR/input.pdf[0]" -background white -alpha remove -resize '1600x900>' "$TESTDIR/output.webp" >>"$REPORT" 2>&1; then
    PDF_CONVERT="yes"
    WEBP_CREATED="yes"
    log "PDF -> WEBP: PASS"
    identify "$TESTDIR/output.webp" >>"$REPORT" 2>&1 || true
  else
    log "PDF -> WEBP: FAIL"
  fi

  log ""
  log "--- Attempt PDF -> PNG fallback ---"
  if convert -density 120 "$TESTDIR/input.pdf[0]" -background white -alpha remove -resize '1600x900>' "$TESTDIR/output.png" >>"$REPORT" 2>&1; then
    PNG_CREATED="yes"
    log "PDF -> PNG: PASS"
    identify "$TESTDIR/output.png" >>"$REPORT" 2>&1 || true
  else
    log "PDF -> PNG: FAIL"
  fi
fi

section "6. DIRECT GHOSTSCRIPT PDF RASTER FALLBACK"
GS_RASTER="no"
if [ "$PDF_CREATED" = "yes" ] && have gs; then
  if gs -q -dNOPAUSE -dBATCH -sDEVICE=png16m -r120 -sOutputFile="$TESTDIR/gs-page-%03d.png" "$TESTDIR/input.pdf" >>"$REPORT" 2>&1; then
    if ls "$TESTDIR"/gs-page-*.png >/dev/null 2>&1; then
      GS_RASTER="yes"
      log "Ghostscript PDF -> PNG raster: PASS"
      if have identify; then identify "$TESTDIR"/gs-page-001.png >>"$REPORT" 2>&1 || true; fi
      if have convert; then
        if convert "$TESTDIR/gs-page-001.png" "$TESTDIR/gs-page-001.webp" >>"$REPORT" 2>&1; then
          log "Ghostscript PNG -> WEBP via ImageMagick: PASS"
        else
          log "Ghostscript PNG -> WEBP via ImageMagick: FAIL"
        fi
      fi
    fi
  else
    log "Ghostscript PDF -> PNG raster: FAIL"
  fi
fi

section "7. FILEINFO FALLBACK OBSERVATION"
if have php; then
  CLI_FILEINFO="$(php -r 'echo extension_loaded("fileinfo") ? "yes" : "no";' 2>/dev/null || echo unknown)"
else
  CLI_FILEINFO="unknown"
fi
log "CLI fileinfo extension : $CLI_FILEINFO"
log "Web fileinfo extension : $WEB_FILEINFO"
log "Laravel should not be installed until required PHP extensions are confirmed/enabled."

section "8. DEPLOYMENT READINESS NOTES"
NODE="no"; have node && NODE="yes"
NPM="no"; have npm && NPM="yes"
log "Node on server       : $NODE"
log "npm on server        : $NPM"
log "Recommended approach : build frontend assets OFF-SERVER and include compiled assets in deployment ZIP."
log "Composer on server   : $(have composer && echo yes || echo no)"

section "9. SUMMARY"
sum "ANDANILY INTERACTIVE - DIAGNOSTIC 01 SUMMARY"
sum "Generated                    : $STAMP"
sum "Web probe                    : $WEB_PROBE_STATUS"
sum "Web PHP version              : $WEB_PHP_VERSION"
sum "Web document root            : $WEB_DOCROOT"
sum "Web fileinfo                 : $WEB_FILEINFO"
sum "CLI fileinfo                 : $CLI_FILEINFO"
sum "Synthetic PDF created        : $PDF_CREATED"
sum "ImageMagick PDF -> WEBP      : $WEBP_CREATED"
sum "ImageMagick PDF -> PNG       : $PNG_CREATED"
sum "Ghostscript PDF raster       : $GS_RASTER"
sum "Node/npm on server           : $NODE/$NPM"
sum ""
sum "Interpretation:"
if [ "$WEB_PHP_VERSION" != "unknown" ]; then
  case "$WEB_PHP_VERSION" in
    8.3.*|8.4.*) sum "- Web PHP is suitable for a modern Laravel baseline." ;;
    *) sum "- Web PHP must be upgraded/switched before Laravel deployment." ;;
  esac
fi
if [ "$WEB_FILEINFO" = "yes" ] && [ "$CLI_FILEINFO" = "yes" ]; then
  sum "- fileinfo is ready in both web and CLI contexts."
else
  sum "- fileinfo is not fully ready; enable it before Paket 00."
fi
if [ "$WEBP_CREATED" = "yes" ] || [ "$GS_RASTER" = "yes" ]; then
  sum "- PDF import has at least one viable local conversion path."
else
  sum "- Local PDF conversion is not yet proven; use another converter/provider or hosting change."
fi
sum "- Because Node/npm are absent, deployment packages should contain precompiled frontend assets."
sum "- Self-hosted persistent WebSocket remains NOT recommended until a managed process path is proven."

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

section "10. 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 01 COMPLETE"
    echo "Download and upload this file back:"
    echo "$RESULT_ZIP"
    echo "=============================================================="
    exit 0
  fi
fi

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