#!/bin/bash

debug=0

getscript() {
    tszen="$TMP/$1"
    cat > $tszen
    echo $tszen
    >&3 echo " ⚙️ $1"
    return 0
}

zexe() {
    if [ "$conf" = "" ]; then
	conf="debug=1,rngseed=hex:00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
    fi
    script=`getscript ${1}`
    if (( $debug >= 1 )); then
	>&3 cat $script
    else
	>&2 cat $script
    fi

    if [ $? != 0 ]; then echo "Error in Zencode script: $script"; return 1; fi

    if [ "$2" == "" ]; then unset $input
    else
	input="$BATS_FILE_TMPDIR/$2"
	if ! [ -r $input ]; then input="$R/docs/examples/zencode_cookbook/$SUBDOC/$2"; fi
	if ! [ -r $input ]; then echo "DATA input not found: $input"; return 1; fi
	>&3 echo "   📝 `basename $input`"
    fi

    if [ "$3" == "" ]; then unset $keys
    else
	keys="$BATS_FILE_TMPDIR/$3"
	if ! [ -r $keys ]; then keys="$R/docs/examples/zencode_cookbook/$SUBDOC/$3"; fi
	if ! [ -r $keys ]; then  echo "KEYS input not found: $keys"; return 1; fi
	>&3 echo "   🔑 `basename $keys`"
    fi

    status=1 # BATS compatible

    tmpout=$TMP/out
    tmperr=$TMP/err

    if [ "$keys" != "" ]; then
	$ZENROOM_EXECUTABLE -c $conf -k $keys -a $input -z $script  1>$tmpout
	status=$?
    elif [ "$input" != "" ]; then
	$ZENROOM_EXECUTABLE -c $conf -a $input -z $script           1>$tmpout
	status=$?
    else
	$ZENROOM_EXECUTABLE -c $conf -z $script                     1>$tmpout
	status=$?
    fi
    if [ $status == 0 ]; then
	mkdir -p "$R/docs/examples/zencode_cookbook/$SUBDOC"
	cat $script > "$R/docs/examples/zencode_cookbook/$SUBDOC/$1"
    fi
    # if [ $status != 0 ]; then >&3 cat $tmperr; fi
    # export output=`cat $TMP/out`
    return $status
}

rngzexe() {
    conf="debug=1"
    zexe $*
}

debug() {
    debug=1
    zexe $*
}

# example:
# json_extract "Alice" petition_request.json > petition_keypair.json
function json_extract {
	if ! [ -r extract.jq ]; then
		cat <<EOF > extract.jq
# break out early
def filter(\$key):
  label \$out
  | foreach inputs as \$in ( null;
      if . == null
      then if \$in[0][0] == \$key then \$in
           else empty
           end
      elif \$in[0][0] != \$key then break \$out
      else \$in
      end;
      select(length==2) );
reduce filter(\$key) as \$in ({};
  setpath(\$in[0]; \$in[1]) )
EOF
	fi
	jq -n -c --arg key "$1" --stream -f extract.jq "$2"
}
# example:
# json_remove "Alice" petition_request.json
function json_remove {
	tmp=`mktemp`
	jq -M "del(.$1)" $2 > $tmp
	mv $tmp $2
	rm -f $tmp
}

function json_join {
	jq -s 'reduce .[] as $item ({}; . * $item)' $*
}

function save_output {
    >&3 echo " 💾 $1"
    export output=`cat $TMP/out`
    mkdir -p $R/docs/examples/zencode_cookbook/$SUBDOC
    if (( $debug >= 1 )); then
	cat $TMP/out | tee "$BATS_SUITE_TMPDIR/$1" | >&3 tee "$R/docs/examples/zencode_cookbook/$SUBDOC/$1"
    else
	cat $TMP/out | tee "$BATS_SUITE_TMPDIR/$1" | >&2 tee "$R/docs/examples/zencode_cookbook/$SUBDOC/$1"
    fi
}

# Used to save something that is not an output
function save_asset() {
    >&3 echo " 💾 $1"
    docs="$R/docs/examples/zencode_cookbook/$SUBDOC"
    mkdir -p ${docs}
    if (( $debug >= 1 )); then
	cat | tee "$BATS_SUITE_TMPDIR/$1"  | >&3 tee "${docs}/$1"
    else
	cat | tee "$BATS_SUITE_TMPDIR/$1" | >&2 tee "${docs}/$1"
    fi
}
# alias to save
function save() { save_asset $1; }
