#!/usr/bin/env bash

set -uo pipefail

SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
PACKAGE_ROOT=$(cd "$SCRIPT_DIR/.." && pwd)

usage() {
    cat <<'EOF'
Usage:
  app-q110-112.sh --static-validate
  app-q110-112.sh preflight app02
  app-q110-112.sh post-clone <app01|app02> <run_id> <--dry-run|--execute>
  app-q110-112.sh activate <app01|app02> <run_id> <--dry-run|--execute>
  app-q110-112.sh verify <app01|app02> <run_id> <postclone|active|rollback>
  app-q110-112.sh rollback <app01|app02> <run_id>
  app-q110-112.sh archive <q110|q111|q112> <run_id>
EOF
}

static_validate() {
    echo APP_PACKAGE_STATIC_VALIDATE_BEGIN
    date '+%Y-%m-%dT%H:%M:%S%z'
    echo "PACKAGE_ROOT=$PACKAGE_ROOT"
    if command -v sha256sum >/dev/null 2>&1; then
        (cd "$PACKAGE_ROOT" && sha256sum -c SHA256SUMS)
    elif command -v shasum >/dev/null 2>&1; then
        (cd "$PACKAGE_ROOT" && shasum -a 256 -c SHA256SUMS)
    else
        echo 'ERROR: no SHA256 checker found' >&2
        return 1
    fi
    for script in "$SCRIPT_DIR"/*.sh; do
        [[ -x "$script" ]] || {
            echo "ERROR: script is not executable: $script" >&2
            return 1
        }
        bash -n "$script"
    done
    echo APP_PACKAGE_STATIC_VALIDATE_RESULT=PASS
    echo APP_PACKAGE_STATIC_VALIDATE_END
}

[[ $# -ge 1 ]] || { usage; exit 2; }
ACTION=$1
shift

echo APP_Q110_112_ENTRY_BEGIN
date '+%Y-%m-%dT%H:%M:%S%z'
echo "ACTION=$ACTION ARG_COUNT=$#"

set +e
case "$ACTION" in
    --static-validate)
        [[ $# -eq 0 ]]
        rc=$?
        if [[ $rc -eq 0 ]]; then static_validate; rc=$?; fi
        ;;
    preflight)
        [[ $# -eq 1 && "$1" == app02 ]]
        rc=$?
        if [[ $rc -eq 0 ]]; then bash "$SCRIPT_DIR/q110-app02-readonly-gate.sh"; rc=$?; fi
        ;;
    post-clone)
        [[ $# -eq 3 ]]
        rc=$?
        if [[ $rc -eq 0 ]]; then bash "$SCRIPT_DIR/app-q110-q111-postclone.sh" "$@"; rc=$?; fi
        ;;
    activate)
        [[ $# -eq 3 && ( "$3" == --dry-run || "$3" == --execute ) ]]
        rc=$?
        if [[ $rc -eq 0 ]]; then bash "$SCRIPT_DIR/app-q111-q112-activate.sh" "$@"; rc=$?; fi
        ;;
    verify)
        [[ $# -eq 3 ]]
        rc=$?
        if [[ $rc -eq 0 ]]; then bash "$SCRIPT_DIR/app-q110-q112-verify.sh" "$@"; rc=$?; fi
        ;;
    rollback)
        [[ $# -eq 2 ]]
        rc=$?
        if [[ $rc -eq 0 ]]; then
            bash "$SCRIPT_DIR/app-q111-q112-activate.sh" "$1" "$2" --rollback
            rc=$?
        fi
        ;;
    archive)
        [[ $# -eq 2 ]]
        rc=$?
        if [[ $rc -eq 0 ]]; then bash "$SCRIPT_DIR/app-q110-112-archive-evidence.sh" "$@"; rc=$?; fi
        ;;
    *)
        usage
        rc=2
        ;;
esac
set -e

echo "APP_Q110_112_ENTRY_RC=$rc"
if [[ $rc -eq 0 ]]; then
    echo APP_Q110_112_ENTRY_RESULT=PASS
else
    echo APP_Q110_112_ENTRY_RESULT=FAIL
fi
echo APP_Q110_112_ENTRY_END
exit "$rc"
