#!/bin/bash

set -e

function ToLower()
{
   declare input=$1
   declare output=($(echo "${input}" | tr 'A-Z' 'a-z'))
   eval $2=output
}

function GetServices()
{
    declare svcs=($(ls ./src/Services|xargs -d '/' echo))
	eval $1="${svcs}"
}

function GetServiceCsProjFile()
{
    declare prefix=${1}
	declare name=${2}
	declare csprojFile="./src/Services/${prefix}/${name}/${name}.csproj"
	eval $3="${csprojFile}"
}

function GetServiceName()
{
    declare prefix=${1}
	declare name=($(ls ./src/Services/${prefix}|head -n 1|xargs -d '/' echo))
	eval $2="${name}"
}

function GetAppName()
{
    declare name=($(grep -oP '(?<=AppName>)[^<]+' "./devops/app.props"))
	eval $1="${name}"
}

function GetSolutionName()
{
    declare name=($(grep -oP '(?<=SolutionName>)[^<]+' "./devops/app.props"))
	eval $1="${name}"
}

function GetImageUserName()
{
    declare name=($(grep -oP '(?<=ImageUserName>)[^<]+' "devops/deploy.props"))
	eval $1="${name}"
}

function GetCiCdSettings()
{
    declare all=($(grep -oP '(?<=AllPublishable>)[^<]+' "/tmp/cicd.props"))
    declare no=($(grep -oP '(?<=NoPublishable>)[^<]+' "/tmp/cicd.props"))
	eval $1=${all}
	eval $2=${no}
}

function GetMajor()
{
    declare m=($(grep -oP '(?<=VersionMajor>)[^<]+' "devops/version.props"))
	eval $1=${m}
}

function GetVersion()
{
    declare major=($(grep -oP '(?<=VersionMajor>)[^<]+' "./devops/version.props"))
	declare minor=($(grep -oP '(?<=VersionMinor>)[^<]+' "./devops/version.props"))
	declare patch=($(grep -oP '(?<=VersionPatch>)[^<]+' "./devops/version.props"))
	eval $1="${major}.${minor}.${patch}"
}

function GetImageRegistrySettings()
{
    declare host=($(grep -oP '(?<=ImageRegistryHost>)[^<]+' "devops/deploy.props"))
    declare username=($(grep -oP '(?<=ImageUserName>)[^<]+' "devops/deploy.props"))
	eval $1=${host}
	eval $2=${username}
}

function GetAccessTokenOf()
{
    declare token=($(grep -oP "(?<=${Environment}AccessToken>)[^<]+" "devops/deploy.props"))
	eval $1="${token}"
}

function IsPublishableOf()
{
    declare prefix=$0
    declare isP=($(grep -oP "(?<=${prefix}Publishable>)[^<]+" "/tmp/cicd.props"))
	eval $1=isP
}

function CI()
{
    declare serviceName=$1
    declare publishFile=$2
	declare publishOutputDir=s2

	GetVersion version
	GetImageUserName registryUserName

	# repository name must be lowercase
	ToLower "${RegistryHost}/${registryUserName}/${serviceName}:${version}" imagefullname
	
	echo ""
	echo "begin delivery for ${serviceName}:${version}..."
	mkdir -p ${publishOutputDir}/${serviceName}
	dotnet publish ${publishFile} -o ../../publish/${serviceName} -c release --no-restore  
	docker build -t ${imagefullname} ${publishOutputDir}/${serviceName}
	docker push ${imagefullname}
	rm -fr ${publishOutputDir}/${serviceName}
	echo "delivery for ${serviceName}:${version} has been successful."
}