#!/bin/bash

function cleanLine() {
  local line key field
  line="$1"
  key="$2"
  field="$3"
  echo "$line" | jq -r "$key" | tr -d 'BbIi' | awk "{print toupper(\$$field)}" | numfmt --from=auto
}

function getFullCSV() { 
  local line out headersOut
  headersOut=0
  lines=$(docker stats --no-stream --format "{{json .}}")
  if [[ ${#lines} -gt 3 ]] ; then
    while read -r line; do
      out=$(echo "$line" | jq -r \
      --arg date "$(date +%s)" \
      --arg BlockIOIn "$(cleanLine "$line" '.BlockIO' 1)" \
      --arg BlockIOOut "$(cleanLine "$line" '.BlockIO' 3)" \
      --arg MemUsage "$(cleanLine "$line" '.MemUsage' 1)" \
      --arg MemLimit "$(cleanLine "$line" '.MemUsage' 3)" \
      --arg NetIOIn "$(cleanLine "$line" '.NetIO' 1)" \
      --arg NetIOOut "$(cleanLine "$line" '.NetIO' 3)" \
      '. + { BlockIOIn: $BlockIOIn, 
       BlockIOOut: $BlockIOOut, 
       MemUsage: $MemUsage, 
       MemLimit: $MemLimit, 
       NetIOIn: $NetIOIn, 
       NetIOOut: $NetIOOut,
       date: $date }
       | del(.BlockIO) | del(.NetIO)
       | . as $input | keys as $cols | $cols, ($cols | map($input[.])) | @csv
       ')
      if [[ "$headersOut" -eq 0 ]]; then
        echo "$out"
        headersOut=1
      else
        echo "$out" | tail -n +2
      fi
     done <<< "$lines"
   else
    return 1
  fi
}

function getValueLine() {
  getFullCSV | tail -n +2
}

# Run until we get a result, outputting headers and breaking out of the while
while true; do
  getFullCSV && break
done

# Run forever, we don't care if the output fails as we've already outputted headers
while true; do
  getValueLine || true
done