#!/usr/bin/ksh
# by Olaf Bohlen <olbohlen@eenfach.de>
# licensed under BSD3 license

APIURL="https://${KUBERNETES_SERVICE_HOST}:${KUBERNETES_SERVICE_PORT_HTTPS}"
NAMESPACE=$(</run/secrets/kubernetes.io/serviceaccount/namespace)
TOKEN=$(</run/secrets/kubernetes.io/serviceaccount/token)
CACRT="/run/secrets/kubernetes.io/serviceaccount/ca.crt"

# some associate arrays we need
typeset -A receiptname
typeset -A receiptversion

CURLOPTS="-s --cacert ${CACRT} -H 'Accept: application/json' -H 'User-Agent: ksh93 receipt processor 0.1' -H 'Authorization: Bearer ${TOKEN}'"


while sleep 5; do
    # MAIN loop

    # we will later store here modified receipt uids, so we clear it for every run
    updatedreceipts=""

    # get a CookieReceiptList item from the API and store the json in a variable
    respjson=$(eval curl -XGET ${CURLOPTS} "${APIURL}/apis/de.eenfach.olbohlen/v1/namespaces/${NAMESPACE}/cookiereceipts?limit=500")

    # check if we got the expected resource:
    kind=$(echo "${respjson}" | jq .kind)
    if [ x${kind} != 'x"CookieReceiptList"' ]; then
	printf "Error: unexpected Result from API\n"
	break ## jump out of this loop iteration
    fi
    
    # how many receipts are there?
    numreceipts=$(echo "${respjson}" | jq .items\[\].metadata.name | wc -l)

    # populate the in memory arrays with json metadata, we need
    # - the name
    # - the uid
    # - the resourceVersion
    # for every receipt to figure out if we need to process them
    i=0
    while [ ${i} -lt ${numreceipts} ]; do
	receiptuid=$(echo "${respjson}" | jq -r .items[${i}].metadata.uid)
	receiptname[${receiptuid}]=$(echo "${respjson}" | jq -r .items[${i}].metadata.name)
	
	# check if we already have processed this version of the receipt, if not
	# store the uid of that receipt in the updatedreceipts var
	newversion=$(echo "${respjson}" | jq -r .items[${i}].metadata.resourceVersion)
	if [ "x${newversion}" != "x${receiptversion[${receiptuid}]}" ]; then
	       # we have an update!
	       updatedreceipts="${updatedreceipts} ${receiptuid}"
	       receiptversion[${receiptuid}]="${newversion}"
	fi
	i=$(( ${i} + 1 ))
    done

    # now that we have a list of updated receipts, we are going to process them
    for r in ${updatedreceipts}; do
	printf "\n\nNew receipt found: %s\n" "${receiptname[${r}]}"
	# get the name for the UID and fetch only that object
	receipt=$(eval curl -XGET ${CURLOPTS} '${APIURL}/apis/de.eenfach.olbohlen/v1/namespaces/${NAMESPACE}/cookiereceipts/${receiptname[${r}]}' )

	# receipt contains now the json for one receipt, now we parse that
	# we set scale to Fahrenheit if sanescale is false, else scale will use Celsius
	scale_b=$( echo "${receipt}" | jq -r .spec.sanescale )
	if [ "x${sanescale}" == "xfalse" ]; then
	    scale=Fahrenheit
	fi
	
	temperature=$( echo ${receipt} | jq -r .spec.temperature )
	
	preheat_b=$( echo "${receipt}" | jq -r .spec.preheat )
	if [ "x${preheat_b}" == "xtrue" ]; then
	    printf "Pre: we heat up the oven to %s degrees %s\n\n" "${temperature}" "${scale:-Celsius}"
	fi

	# how many ingredients do we have?
	num_in=$(echo "${receipt}" | jq .spec.ingredients\[\].name | wc -l)
	
	# list up that we fetch needed ingredients
	printf "Fetching ingredients from receipt:\n"
	i=0
	while [ ${i} -lt ${num_in} ]; do
	    in_name=$( echo "${receipt}" | jq -r .spec.ingredients[${i}].name )
	    in_amount=$( echo "${receipt}" | jq -r .spec.ingredients[${i}].amount )
	    in_unit=$( echo "${receipt}" | jq -r .spec.ingredients[${i}].unit )
	    in_remarks=$( echo "${receipt}" | jq -r .spec.ingredients[${i}].remarks )
		    
	    printf "Fetching %s%s of %s" "${in_amount}" "${in_unit}" "${in_name}"
	    if [ "x${in_remarks}" != "xnull" ]; then
		printf " (%s)" "${in_remarks}"
	    fi
	    printf "\n"
	    sleep 1
	    i=$(( ${i} + 1 ))
	done


	# now we need to (unfortunately just!) simulate the processing
	# the order of the steps is important, but lists are not ordered, so we have
	# an "order" attribute in each list item, and we select on that.
	# first again, we need the amount of instructions...

	num_steps=$(echo "${receipt}" | jq .spec.steps\[\].order | wc -l)

	# now let's iterate over that
	printf "Processing the instructions:\n"
	i=1
	while [ ${i} -lt ${num_steps} ]; do
	    instruction=$( echo "${receipt}" | jq '.spec.steps[] | select(.order == '${i}') | { instruction | join (" ")' )

	    printf "Step %i/%i: %s..." ${i} ${num_steps} "${instruction}"
	    sleep $(( ${RANDOM} % 6 + 1 ))
	    printf "done\n"
	    sleep 1
	    i=$(( ${i} + 1 ))
	done
	printf "Done with this receipt.\n\n"
    done
done
    
