#!/bin/bash
set -euo pipefail

args=$1
shift 1

function wait_for_stack_completion() {
  local stack_id=$1
  while true; do
    status=$(aliyun ros GetStack --StackId "$stack_id" | jq -r '.Status')
    echo "Current stack status: $status"
    if [[ "$status" == "CREATE_COMPLETE" || "$status" == "UPDATE_COMPLETE" ]]; then
      break
    elif [[ "$status" == "CREATE_FAILED" || "$status" == "UPDATE_FAILED" || "$status" == "CREATE_ROLLBACK_COMPLETE" ]]; then
      echo "Stack operation failed with status: $status"
      exit 1
    fi
    sleep 30
  done
}

k8sName=$(echo "$args" | yq ".k8s.name")
region=$(echo "$args" | yq ".region.region")
templateFile=$(echo "$args" | yq '.k8s.template-path')
echo "k8sName=$k8sName"
echo "region=$region"
echo "templateFile=$templateFile"

template=$(echo "$args" | gomplate -c .=stdin:///in.yml -f "$templateFile")
if test $? -ne 0; then
    echo "Failed to render ROS template"
    exit 1
fi
echo -e "Template: \n$template"
aliyun ros ValidateTemplate --TemplateBody="$template"
stack_id=$(aliyun ros ListStacks --StackName.1 "$k8sName" | jq -r '.Stacks[0].StackId // ""')
if [[ -z "$stack_id" ]]; then
  stack_id=$(aliyun ros CreateStack --StackName "$k8sName" --TemplateBody="$template" | jq -r '.StackId')
  sleep 60 # wait stack creation to start
  wait_for_stack_completion $stack_id
else
  aliyun ros UpdateStack --StackId "$stack_id" --TemplateBody="$template"
  sleep 60 # wait stack updation to start
  wait_for_stack_completion $stack_id
fi

