#! /bin/sh
#
# usage: with cac ./generate-networking-configuration c838-828 cd
#
set -euf

cac_servername=$1
hostname=$2

# This is somewhat required because cloudatcost requires whitelisting
# of hosts.  If you whitelist your localhost, then leave this empty.
# cac_via=
#
# cac_key=
# cac_login=
# cac_servername=

# hostname=

main() {
  listservers=$(cac_listservers)

  listserversstatus=$(echo $listservers | jq -r .status)
  case $listserversstatus in
    ok) : ;;
    *)
      echo $0: bad listservers status: $listserversstatus >&2
      exit 1
  esac

  config=$(echo $listservers \
      | jq -r ".data|map(select(.servername == \"$cac_servername\"))[]")

  serverstatus=$(echo $config | jq -r .status)
  case $serverstatus in
    'Powered On') : ;;
    *)
      echo $0: bad server status: $serverstatus >&2
      exit 2
  esac

  print_networking_configuraton "$config"
}


cac_listservers() {
  if test -z "${cac_via-}"; then
    curl -fsS \
      "https://panel.cloudatcost.com/api/v1/listservers.php?key=$cac_key&login=$cac_login"
  else
    ssh -q $cac_via -t curl -fsS \
      "https://panel.cloudatcost.com/api/v1/listservers.php?key=$cac_key\\&login=$cac_login"
  fi
}


print_networking_configuraton() {
  config=$1
  address=$(echo $config | jq -r .ip)
  gateway=$(echo $config | jq -r .gateway)
  nameserver=8.8.8.8
  netmask=$(echo $config | jq -r .netmask)
  prefixLength=$(netmaskToPrefixLengh $netmask)

  # TODO generate all config and put it into a temp dir, then rsync that
  #
  # upload configuration (to /root)
  #
  printf '{...}:\n'
  printf '{\n'
  printf '  networking.hostName = "%s";\n' $hostname
  printf '  networking.interfaces.enp2s1.ip4 = [\n'
  printf '    {\n'
  printf '      address = "%s";\n' $address
  printf '      prefixLength = %d;\n' $prefixLength
  printf '    }\n'
  printf '  ];\n'
  printf '  networking.defaultGateway = "%s";\n' $gateway
  printf '  networking.nameservers = [\n'
  printf '    "%s"\n' $nameserver
  printf '  ];\n'
  printf '}\n'
}

netmaskToPrefixLengh() {
  binaryNetmask=$(echo $1 | sed 's/^/obase=2;/;s/\./;/g' | bc | tr -d \\n)
  binaryPrefix=$(echo $binaryNetmask | sed -n 's/^\(1*\)0*$/\1/p')
  if ! echo $binaryPrefix | grep -q .; then
    echo $0: bad netmask: $netmask >&2
    exit 4
  fi
  printf %s $binaryPrefix | tr -d 0 | wc -c
}


main "$@"