#!/bin/bash

. /srv/rdaa/service/.env

mac="$(cat /sys/class/net/eth0/address)"
uid="$(echo $mac | sed 's/://g')"

rawip="$(ip -4 addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}')"

for address in ${rawip}; do
  if ip ro | grep default | grep -q ${address}; then
    ip=${address}
  fi
done

if [ -z "${ip}" ]; then
  echo "Routable IP address not found, check your network connection"
  exit 1
fi

echo "RDAA_UID=$uid" > /srv/rdaa/service/.uid

shield_version=2

description="RDA will be authorized with uid:"${uid}", mac:"${mac}", ip:"${ip}

while [ -z "$bearer_token" ]; do
  auth_request="$(curl -f -s -X POST 'https://'$RDBA_HOST_ADDRESS'/authserver-service/oauth/token' -H 'accept: application/json' -H 'Content-Type: application/x-www-form-urlencoded' -H 'X-CSRF-TOKEN: ' -d 'grant_type='$grant_type'&client_id='$client_id'&username='$username_auth'&password='$password_auth'' | jq '.')"
  bearer_token="$(echo $auth_request | jq --raw-output '.access_token')"
  if [ -z "$bearer_token" ]; then
    echo "Cannot get bearer token from RDBA! Will try another one..."
    echo -e "\nCannot get bearer token from RDBA! Will try another one...\n" > /dev/tty0
    sleep 5
  fi
done

response_file=$(mktemp)
while [[ -z "$response" || ! -z "$error" ]]; do
  http_code="$(curl -s -w "%{http_code}" -o $response_file -X POST 'https://'$RDBA_HOST_ADDRESS'/rdas-service/api/v1/rdas' -H 'Content-Type: application/json' -d '{"uid":"'$uid'","description":"'"$description"'","shieldVersion":"'$shield_version'","ipAddress":"'$ip'"}' -H 'Authorization: Bearer '$bearer_token'')"

  if [ "$http_code" != "200" ]; then
    echo "Error on RDBA request! HTTP Error $http_code"
    echo -e "\nError on RDBA request! HTTP Error $http_code\n" > /dev/tty0
  fi

  error=$(jq '.error' $response_file)
  if [ "$?" != "0" ]; then
    error="Unparseable server answer"
  elif [ "$error" == "null" ]; then
    error=''
  fi

  if [[ ! -z "$error" || "$http_code" != "200" ]];then
    echo "Error on RDBA request! Error message: $error"
    echo -e "\nError on RDBA request! Error message: $error\n" > /dev/tty0
    sleep 5
    continue
  fi

  response=$(cat $response_file)
  if [ -z "$response" ]; then
    echo "Cannot register on RDBA! Will try another one..."
    echo -e "\nCannot register on RDBA! Will try another one...\n" > /dev/tty0
  fi
  sleep 5
done


priv_key="$(jq -r '.privateKey' $response_file)"
rddc_uri="$(jq -r '.rddc.uri' $response_file)"
rddc_port="$(jq -r '.rddc.adapterservicePort' $response_file)"

if [ ! -z $priv_key ]; then

  if [ ! -d /srv/rdaa/etc ]; then
    mkdir /srv/rdaa/etc
  fi

  rdos_version="$(/usr/local/bin/rdos_common_data os_version)"

  echo "authorized" > /srv/rdaa/etc/.state
  sed -i "s|RDAA_PRIVATE_KEY=.*|RDAA_PRIVATE_KEY=$priv_key|" /srv/rdaa/service/.env
  sed -i "s|RDDC_HOST_ADDRESS=.*|RDDC_HOST_ADDRESS=$rddc_uri|" /srv/rdaa/service/.env
  sed -i "s|RDDC_HOST_PORT=.*|RDDC_HOST_PORT=$rddc_port|" /srv/rdaa/service/.env

  # print on log and to stdout on manual run
  echo "RDA authorized in DataBase"
  echo "RDOS Version: $rdos_version"
  echo "RDA ENVIRONMENT is: $ENVIRONMENT"
  echo "RDA UID is: $uid"
  echo "RDA IP is: $ip"

  # print to attached monitor
  echo -e "\nRDA authorized in DataBase\n" > /dev/tty0
  /srv/rdaa/bin/start

  sync
  sleep 30
  exit 0
  rm -f $response_file
else
  echo "RDA authorization failed with response "$response
  echo -e "\nRDA authorization failed with response "$response"\n" > /dev/tty0
  exit 1
fi
