#!/usr/bin/env bash
set -u
set -o pipefail

if [ "$#" -ne 2 ]; then
    echo "TRANSPORT_PREFLIGHT_FAIL"
    echo "REASON=INVALID_ARGUMENT_COUNT"
    echo 'USAGE: 새문서전송사전검사 "URL" "NAME"' >&2
    exit 2
fi

URL="$1"
NAME="$2"

TMP_DIR="$(mktemp -d /tmp/ev424_docw_transport_preflight.XXXXXX)" || {
    echo "TRANSPORT_PREFLIGHT_FAIL"
    echo "REASON=TEMPORARY_DIRECTORY_CREATION_FAILED"
    exit 70
}

cleanup() {
    rm -rf -- "$TMP_DIR"
}
trap cleanup EXIT

echo "TRANSPORT_PREFLIGHT_URL=$URL"
echo "TRANSPORT_PREFLIGHT_NAME=$NAME"

curl -sSIL --connect-timeout 5 --max-time 12 \
    "$URL" \
    > "$TMP_DIR/head.headers.txt" \
    2> "$TMP_DIR/head.stderr.txt"
HEAD_CURL_RC=$?

HEAD_HTTP_STATUS="$(awk '/^HTTP\//{gsub(/\r/,""); value=$2} END{print value}' "$TMP_DIR/head.headers.txt")"
HEAD_CONTENT_TYPE="$(awk -F': ' 'BEGIN{IGNORECASE=1} /^content-type:/{gsub(/\r/,""); value=tolower($2)} END{print value}' "$TMP_DIR/head.headers.txt" | cut -d';' -f1 | tr -d ' ')"

echo "HEAD_CURL_RC=$HEAD_CURL_RC"
echo "HEAD_HTTP_STATUS=$HEAD_HTTP_STATUS"
echo "HEAD_CONTENT_TYPE=$HEAD_CONTENT_TYPE"

probe_range() {
    local label="$1"
    shift

    local body="$TMP_DIR/${label}.body.bin"
    local headers="$TMP_DIR/${label}.headers.txt"
    local errors="$TMP_DIR/${label}.stderr.txt"

    curl "$@" -L -sS --connect-timeout 5 --max-time 20 \
        --range 0-7 \
        -H 'Accept: application/pdf,*/*' \
        -A 'EV424-DOCW-transport-preflight/1.0' \
        -D "$headers" \
        -o "$body" \
        "$URL" \
        2> "$errors"
    local curl_rc=$?

    local http_status
    local content_type
    local content_range
    local body_bytes
    local body_hex
    local pass

    http_status="$(awk '/^HTTP\//{gsub(/\r/,""); value=$2} END{print value}' "$headers" 2>/dev/null)"
    content_type="$(awk -F': ' 'BEGIN{IGNORECASE=1} /^content-type:/{gsub(/\r/,""); value=tolower($2)} END{print value}' "$headers" 2>/dev/null | cut -d';' -f1 | tr -d ' ')"
    content_range="$(awk -F': ' 'BEGIN{IGNORECASE=1} /^content-range:/{gsub(/\r/,""); value=$2} END{print value}' "$headers" 2>/dev/null)"
    body_bytes="$(wc -c < "$body" 2>/dev/null | tr -d ' ')"
    body_hex="$(head -c 16 "$body" 2>/dev/null | od -An -tx1 -v | tr -d ' \n')"

    pass="NO"
    if [ "$curl_rc" -eq 0 ] \
        && [ "${body_hex#25504446}" != "$body_hex" ] \
        && [ "${body_bytes:-0}" -ge 4 ] \
        && { [ "$http_status" = "200" ] || [ "$http_status" = "206" ]; } \
        && [ "$content_type" = "application/pdf" ]; then
        pass="YES"
    fi

    {
        echo "${label}_CURL_RC=$curl_rc"
        echo "${label}_HTTP_STATUS=$http_status"
        echo "${label}_CONTENT_TYPE=$content_type"
        echo "${label}_CONTENT_RANGE=$content_range"
        echo "${label}_BODY_BYTES=${body_bytes:-0}"
        echo "${label}_BODY_HEX_PREFIX=${body_hex:0:32}"
        echo "${label}_PDF_MAGIC_PASS=$pass"
    } > "$TMP_DIR/${label}.result.txt"

    cat "$TMP_DIR/${label}.result.txt"
}

probe_range DEFAULT
probe_range HTTP2 --http2
probe_range HTTP1 --http1.1

for label in DEFAULT HTTP2 HTTP1
do
    if grep -Fqx "${label}_PDF_MAGIC_PASS=YES" "$TMP_DIR/${label}.result.txt"
    then
        echo "TRANSPORT_PREFLIGHT_PASS"
        echo "SELECTED_TRANSPORT_PROBE=$label"
        echo "DUPLICATE_DECISION_EXECUTED=NO"
        echo "OK_TO_RUN_OUTPUT_EMITTED=NO"
        exit 0
    fi
done

if grep -Eq '^(DEFAULT|HTTP2|HTTP1)_CURL_RC=0$' "$TMP_DIR"/*.result.txt
then
    echo "TRANSPORT_PREFLIGHT_HOLD"
    echo "REASON=FRESH_PDF_TRANSPORT_EVIDENCE_NOT_CONFIRMED"
    echo "DUPLICATE_DECISION_EXECUTED=NO"
    echo "OK_TO_RUN_OUTPUT_EMITTED=NO"
    exit 20
fi

echo "TRANSPORT_PREFLIGHT_FAIL"
echo "REASON=ALL_TRANSPORT_PROBES_FAILED"
echo "DUPLICATE_DECISION_EXECUTED=NO"
echo "OK_TO_RUN_OUTPUT_EMITTED=NO"
exit 21
