#!/bin/bash
set -e
IFS=$'\n\n'

# Import external functions
chmod +x ./devops/PipeLines/Functions.core.sh
source ./devops/PipeLines/Functions.core.sh

GetAppName appName

echo "Start dynamically building the gateway route for ${appName}..."

# resilience handle
# Maximum time in seconds that you allow the whole operation to take.
declare maxTime=5 
# Maximum time in seconds that you allow the connection to the server to take.
declare maxConnectTime=2
declare retryCount=5

## add services
function createService()
{
	curl -X POST $1 \
	--connect-timeout $2 \
	--max-time $3 \
	--retry $4 \
	-H  "accept: application/json" \
	-H  "Content-Type: application/json" \
	-d "{ \"name\": \"$5\",  \"url\": \"$6\"}";
}

## add routes
function createRoute()
{
    declare svcResponse=$(curl -X GET ${kongServiceBaseUrl}/$5 --connect-timeout $2 --max-time $3 --retry $4)
    declare JQ_EXEC=`which jq`
    declare svcId=$(echo $svcResponse | ${JQ_EXEC} .id | sed 's/\"//g')
	declare defMethods="[\"GET\",\"POST\"]"

	set +e
	if [ -n "$8" ]; then
	   defMethods=$8
	fi

	if [ -z "$svcId" ]; then
	  echo "Warnning, failed to get the service[$5] identifier, route cannot be created.";
    else
	  # idempotent
	  declare routesAdded=$(curl -X GET ${kongServiceBaseUrl}/$5/routes)
	  declare routeid=$(echo $routesAdded | ${JQ_EXEC} .data[0].id | sed 's/\"//g')
	  if [ "$routeid" == "null" ]; then
        curl -X POST $1 \
	    --connect-timeout $2 \
	    --max-time $3 \
	    --retry $4 \
	    -H  "accept: application/json" \
	    -H  "Content-Type: application/json" \
	    -d "{ \"service\": "{\"id\":\"$svcId\"}",\"paths\": "[\"$6\"]",\"methods\": "$defMethods",\"strip_path\":$7,\"hosts\": "[\"${KongRouteDomain}\"]"}";
      fi
	fi
	set -e
}

GetMajor major
GetNameSpace namespace
GetKongApiServer KongApiServer
GetKongRouteDomain KongRouteDomain

declare fdnOfK8s="${namespace}.svc.cluster.local"
declare kongServiceBaseUrl="${KongApiServer}/services"
declare kongRouteBaseUrl="${KongApiServer}/routes"
declare releaseVersion="v${major}"

for servicePrefix in `ls ./src/Services|xargs -d '/'`
do
  GetServiceName ${servicePrefix} serviceName
  # replace . to -, compatible with k8s.
  Replace ${serviceName} '.' '-' serviceName
  ToLower "${serviceName}-${releaseVersion}" serviceNameWithVersion
  ToLower "${serviceName}.${fdnOfK8s}" serviceFdn
  ToLower ${servicePrefix} prefix
  ToLower "http://${serviceFdn}/api/${prefix}" serviceUrl

  echo "Begin creating service[${serviceNameWithVersion}]"
  createService ${kongServiceBaseUrl} ${maxConnectTime} ${maxTime} ${retryCount} ${serviceNameWithVersion} ${serviceUrl}

  echo "Begin creating route of service[${serviceNameWithVersion}]" 
  ToLower "/api/${releaseVersion}/${prefix}" serviceRouteUrl
  createRoute ${kongRouteBaseUrl} ${maxConnectTime} ${maxTime} ${retryCount} ${serviceNameWithVersion} ${serviceRouteUrl} true
done

echo ""
echo "Dynamicly building gateway route successfully !!!"