#!/usr/bin/env bash
set -euo pipefail

LAST="$HOME/.ev424_doc_last_run"

# 인자 없으면: USAGE 고정 출력 대신, last-run + 다음 스텝 안내(트리거처럼)
if [ "${1:-}" = "" ]; then
  echo "=== DOC_PASSPORT_TRIGGER (FACT) ==="
  if [ -s "$LAST" ]; then
    # shellcheck disable=SC1090
    # BEGIN EV424 G06 DATA-ONLY POINTER PARSER
    unset RUN_DIR SOURCE URL ISSUED_DATE
    declare -A EV424_POINTER_SEEN=()
    while IFS= read -r EV424_POINTER_LINE || [ -n "$EV424_POINTER_LINE" ]; do
      if [[ ! "$EV424_POINTER_LINE" =~ ^([A-Z][A-Z0-9_]*)=\"([^\"]*)\"$ ]]; then
        echo "ERROR: invalid last-run pointer line" >&2
        exit 2
      fi
      EV424_POINTER_KEY="${BASH_REMATCH[1]}"
      EV424_POINTER_VALUE="${BASH_REMATCH[2]}"
      case "$EV424_POINTER_KEY" in
        RUN_DIR|SOURCE|URL|ISSUED_DATE) ;;
        *) echo "ERROR: unexpected pointer key: $EV424_POINTER_KEY" >&2; exit 2 ;;
      esac
      if [ -n "${EV424_POINTER_SEEN[$EV424_POINTER_KEY]+x}" ]; then
        echo "ERROR: duplicate pointer key: $EV424_POINTER_KEY" >&2
        exit 2
      fi
      EV424_POINTER_SEEN["$EV424_POINTER_KEY"]=1
      case "$EV424_POINTER_VALUE" in
        *'$('*|*'`'*) echo "ERROR: shell command substitution signal in pointer value" >&2; exit 2 ;;
      esac
      printf -v "$EV424_POINTER_KEY" "%s" "$EV424_POINTER_VALUE"
    done < "$LAST"
    if [ -z "${RUN_DIR+x}" ] || [ -z "${RUN_DIR}" ]; then
      echo "ERROR: missing required pointer key: RUN_DIR" >&2
      exit 2
    fi
    if [ -z "${SOURCE+x}" ] || [ -z "${SOURCE}" ]; then
      echo "ERROR: missing required pointer key: SOURCE" >&2
      exit 2
    fi
    if [ -z "${URL+x}" ] || [ -z "${URL}" ]; then
      echo "ERROR: missing required pointer key: URL" >&2
      exit 2
    fi
    if [ -z "${ISSUED_DATE+x}" ] || [ -z "${ISSUED_DATE}" ]; then
      echo "ERROR: missing required pointer key: ISSUED_DATE" >&2
      exit 2
    fi
    EV424_RUN_ROOT="/var/lib/ev424/ev424_evidence"
    EV424_RUN_ROOT_CANONICAL="$(readlink -f -- "$EV424_RUN_ROOT")" || { echo "ERROR: allowed run root cannot be resolved" >&2; exit 2; }
    EV424_RUN_DIR_CANONICAL="$(readlink -f -- "$RUN_DIR")" || { echo "ERROR: RUN_DIR cannot be resolved" >&2; exit 2; }
    if [ "$RUN_DIR" != "$EV424_RUN_DIR_CANONICAL" ]; then
      echo "ERROR: RUN_DIR is not canonical" >&2
      exit 2
    fi
    case "$EV424_RUN_DIR_CANONICAL" in
      "$EV424_RUN_ROOT_CANONICAL"/*) ;;
      *) echo "ERROR: RUN_DIR outside allowed root" >&2; exit 2 ;;
    esac
    if [ -n "${SOURCE+x}" ]; then
      if [ -z "$SOURCE" ] || [ "$SOURCE" != "$(basename -- "$SOURCE")" ] || [ "$SOURCE" = "." ] || [ "$SOURCE" = ".." ]; then
        echo "ERROR: SOURCE is not a valid basename" >&2
        exit 2
      fi
    fi
    unset EV424_POINTER_LINE EV424_POINTER_KEY EV424_POINTER_VALUE
    unset EV424_RUN_ROOT EV424_RUN_ROOT_CANONICAL
    unset EV424_RUN_DIR_CANONICAL EV424_POINTER_SEEN
    # END EV424 G06 DATA-ONLY POINTER PARSER
    echo "LAST_RUN_DIR=${RUN_DIR:-N/A}"
    echo "LAST_SOURCE=${SOURCE:-N/A}"
    echo "LAST_URL=${URL:-N/A}"
    echo "LAST_ISSUED_DATE=${ISSUED_DATE:-N/A}"
    echo "NEXT_STEPS: 문서역권2 -> 문서역권3 -> 문서역권4 -> 문서역권5"
    echo "RE-PICK_SAME_URL (copy/paste):"
    echo "  문서역권 \"${URL:-}\" \"RETRY_$(date +%Y%m%d_%H%M%S)\""
    echo "NEW_PICK_TEMPLATE (copy/paste):"
    echo "  문서역권 \"<OFFICIAL_PDF_URL>\" \"<NAME>\""
  else
    echo "NO_LAST_RUN_POINTER=$LAST"
    echo "NEW_PICK_TEMPLATE (copy/paste):"
    echo "  문서역권 \"<OFFICIAL_PDF_URL>\" \"<NAME>\""
  fi
  exit 0
fi

# Step1: URL/NAME 입력 계약
URL="$1"
NAME="${2:-DOC_PICK_$(date +%Y%m%d_%H%M%S)}"
SOURCE="$(basename "$URL")"

DAY="/var/lib/ev424/ev424_evidence/$(date +%F)"
ISSUED_DATE="$(date +%Y-%m-%dT%H:%M:%S%z)"
UA="EV424 ev424.verify@gmail.com"
RUN_DIR="$DAY/RUN_${ISSUED_DATE}_${NAME}"

mkdir -p "$RUN_DIR"

echo "=== STEP1_PICK (FACT) ==="
echo "DAY=$DAY"
echo "RUN_DIR=$RUN_DIR"
echo "SOURCE=$SOURCE"
echo "URL=$URL"
echo "NAME=$NAME"
echo "ISSUED_DATE=$ISSUED_DATE"

FINAL_URL="$(curl -A "$UA" -fsSIL --connect-timeout 4 --max-time 12 -o /dev/null -w '%{url_effective}' "$URL" 2>/dev/null | tr -d "\r" || true)"
if [ -z "${FINAL_URL:-}" ]; then FINAL_URL="$URL"; fi
echo "FINAL_URL=$FINAL_URL"

echo "=== HEAD_BASELINE (FACT) ==="
HRAW=$(curl -A "$UA" -fsSI --connect-timeout 4 --max-time 10 "$FINAL_URL" 2>&1 | tr -d "\r" || true)
printf "%s\n" "$HRAW" | sed -n "1,20p"

# HEAD_BASELINE gate (FACT-only) with Range GET fallback
HCODE=$(printf "%s\n" "$HRAW" | sed -n "1p" | awk "{print \$2}")
HCT=$(printf "%s\n" "$HRAW" | awk -F": " "tolower(\$1)==\"content-type\"{print \$2; exit}")
HLEN=$(printf "%s\n" "$HRAW" | awk -F": " "tolower(\$1)==\"content-length\"{print \$2; exit}")
if [ -z "${HCODE:-}" ]; then HCODE=EMPTY; fi
if [ -z "${HCT:-}" ]; then HCT=EMPTY; fi
if [ -z "${HLEN:-}" ]; then HLEN=EMPTY; fi

HEAD_OK=0
if printf "%s" "$HCT" | grep -qi "application/pdf"; then
  HEAD_OK=1
fi

if [ "$HEAD_OK" -ne 1 ]; then
  RRAW=$(curl -A "$UA" -fsS -D - -H "Range: bytes=0-0" --connect-timeout 5 --max-time 12 "$FINAL_URL" -o /dev/null 2>&1 | tr -d "\r" || true)
  printf "%s\n" "$RRAW" | sed -n "1,20p"
  RCODE=$(printf "%s\n" "$RRAW" | awk "tolower(\$1) ~ /^http\\// {code=\$2} END{print code}")
  RCT=$(printf "%s\n" "$RRAW" | awk -F": " "tolower(\$1)==\"content-type\"{v=\$2} END{print v}")
  RLEN=$(printf "%s\n" "$RRAW" | awk -F": " "tolower(\$1)==\"content-length\"{v=\$2} END{print v}")
  if [ -z "${RCODE:-}" ]; then RCODE=EMPTY; fi
  if [ -z "${RCT:-}" ]; then RCT=EMPTY; fi
  if [ -z "${RLEN:-}" ]; then RLEN=EMPTY; fi
  if { [ "${RCODE}" = "200" ] || [ "${RCODE}" = "206" ]; } && printf "%s" "$RCT" | grep -qi "application/pdf"; then
    HEAD_OK=1
    echo "HEAD_FALLBACK=RANGE_206_PDF"
  else
    echo "FAILURE_FACT_PACK"
    echo "FAILED_CHECK: HEAD_NOT_PDF"
    echo "OBSERVABLES:"
    echo "- FINAL_URL: ${FINAL_URL}"
    echo "- HEAD_HTTP_CODE: ${HCODE}"
    echo "- HEAD_CONTENT_TYPE: ${HCT}"
    echo "- HEAD_CONTENT_LENGTH: ${HLEN}"
    echo "- RANGE_HTTP_CODE: ${RCODE}"
    echo "- RANGE_CONTENT_TYPE: ${RCT}"
    echo "- RANGE_CONTENT_LENGTH: ${RLEN}"
    exit 2
  fi
fi

# Step1 PASS token (baseline PDF passed)
printf "STEP1_BASELINE=PASS\n" > "$RUN_DIR/step1.pass"
chmod 600 "$RUN_DIR/step1.pass"
cat > "$RUN_DIR/pick_record.txt" <<EOR
SOURCE=$SOURCE
URL=$FINAL_URL
NAME=$NAME
ISSUED_DATE=$ISSUED_DATE
EOR
sha256sum "$RUN_DIR/pick_record.txt" | awk "{print \"PICK_RECORD_SHA256=\" \$1}"

# last-run pointer (Step2~5가 읽음)
cat > "$LAST" <<EOL
RUN_DIR="$RUN_DIR"
SOURCE="$SOURCE"
URL="$FINAL_URL"
ISSUED_DATE="$ISSUED_DATE"
EOL
sha256sum "$LAST" | awk "{print \"LAST_RUN_POINTER_SHA256=\" \$1}"
