#!/bin/bash

usage() {
  [ -n "$1" ] && {
    echo $1
    echo
  }
  echo "Usage:"
  echo "$0 [-csv <file>] [-f] [-q] get|set"
  echo "Using Input CSV file given by -csv argument, either get all channel info, or set all channel info."
  echo "If not given, the file config.csv in the working directory is chosen"
  echo "Setting -f (force) will call the RPCs, without it, only print what would be sent"
  echo "Setting -q (quiet) will only output the CSV and errors"
  echo ""
  exit -1
}

log() {
  [ $QUIET -eq 1 ] && return
  echo "# $*"
}


doget() {
  echo "# Generated on $(date)"
  echo "# Device,IPv4,Chan,Name,TimeSpec(UTC)"
  while IFS=, read -r dev ip chan name timespec
  do
    [ "${dev:0:1}" == "#" ] && continue
    cmd="mos --port ws://$ip/rpc call TimeSpec.Get '{\"idx\": $chan }'"
    log "$cmd"
    SPEC=$(eval $cmd | awk '/spec/ { print $2 }' | sed -e 's,",,g')
    echo "$dev,$ip,$chan,$name,$SPEC"
  done < $CONFIG
}

doset() {
# Device,IPv4,Chan,Name,TimeSpec(UTC)
  while IFS=, read -r dev ip chan name timespec
  do
    [ "${dev:0:1}" == "#" ] && continue
  
    cmd="mos --port ws://$ip/rpc call TimeSpec.Clear '{\"idx\": $chan }'"
    log "$cmd"
    [ $FORCE -ne 0 ] && {
      eval $cmd
    }
    cmd="mos --port ws://$ip/rpc call TimeSpec.Add '{\"idx\": $chan, \"spec\": \"$timespec\" }'"
    log "$cmd"
    [ $FORCE -ne 0 ] && {
      eval $cmd
    }
  done < $CONFIG
}

VERB="get"
CONFIG="config.csv"
FORCE=0
QUIET=0

while [ $# -ne 0 ]; do
  case $1 in
    -f)
      FORCE=1
      ;;
    -q)
      QUIET=1
      ;;
    -csv)
      shift
      CONFIG=$1
      ;;
    get)
      VERB="get"
      ;;
    set)
      VERB="set"
      ;;
    *)
      usage "Unknown commandline flag '$1'"
      ;;
  esac
  shift
done

[ ! -r $CONFIG ] && {
  echo "Cannot open file '$CONFIG'"
  exit -2
}


case $VERB in
  get)
    doget
    ;;
  set)
    doset
    ;;
  *)
    echo "Unknown verb: $VERB"
    exit -3;
    ;;
esac