#!/bin/bash
#*******************************************************************************
# Copyright (c) 2019 IBM Corporation and others.
#
# This program and the accompanying materials
# are made available under the terms of the Eclipse Public License 2.0
# which accompanies this distribution, and is available at
# https://www.eclipse.org/legal/epl-2.0/
#
# SPDX-License-Identifier: EPL-2.0
#
# Contributors:
#     Sravan Kumar Lakkimsetti - initial API and implementation
#*******************************************************************************

# USAGE: fn-write-property VAR_NAME
#   VAR_NAME: Variable name to write as "variable=value" form
# This script assumes the following variables have been defined and are pointing
# to an appropriate file (see master-build.sh):
# BUILD_ENV_FILE=${buildDirectory}/buildproperties.shsource
# BUILD_ENV_FILE_PHP=${buildDirectory}/buildproperties.php
# BUILD_ENV_FILE_PROP=${buildDirectory}/buildproperties.properties

# Note we always append to file, assuming if doesn't exist yet and will be
# created, and for each build, it won't exist, so will be written fresh for
# each build.

fn-write-property ()
{
  echo "export $1=$2" >> $BUILD_ENV_FILE
  echo "\$$1 = $2;" >> $BUILD_ENV_FILE_PHP
  echo "$1 = $2" >> $BUILD_ENV_FILE_PROP
}

# this function executes command passed as command line parameter and
# if that command fails it exit with the same error code as the failed command
fn-run-command ()
{
  $*
  returnCode=$?
  if [ $returnCode != 0 ]; then
    echo "Execution of \"$*\" failed with return code : $returnCode"
    exit $returnCode
  fi
}

fn-notarize-macbuild ()
{
  set -x
  BUILD_DIR="$1"; shift
  DMG="$1"; shift

  pushd "$BUILD_DIR" || exit 5

  PRIMARY_BUNDLE_ID="${DMG//-macosx-cocoa-x86_64.dmg/}"

  retryCount=3
  while [ ${retryCount} -gt 0 ]; do

    RAW_RESPONSE=$(curl -sS --write-out "\n%{http_code}" -X POST -F file=@"${DMG}" -F 'options={"primaryBundleId": "'"${PRIMARY_BUNDLE_ID}"'", "staple": true};type=application/json' http://172.30.206.146:8383/macos-notarization-service/notarize || : )

    RESPONSE=$(head -n-1 <<<"${RAW_RESPONSE}")
    STATUS_CODE=$(tail -n1 <<<"${RAW_RESPONSE}")

    if [[ "${STATUS_CODE}" != "200" ]]; then
      echo "Bad response from the server (status=${STATUS_CODE})"
      echo "${RESPONSE}"
      retryCount=$((retryCount - 1))
      if [ $retryCount -eq 0 ]; then
        echo "Notarization failed 3 times. Exiting"
        exit 1
      else
        echo "Retrying..."
        sleep 2
      fi
    fi

    UUID=$(echo "$RESPONSE" | grep -Po '"uuid"\s*:\s*"\K[^"]+' || : )
    STATUS=$(echo "$RESPONSE" | grep -Po '"status"\s*:\s*"\K[^"]+' || : )

    while [[ ${STATUS} == 'IN_PROGRESS' ]]; do
      sleep 1m
      RESPONSE=$(curl -sS "http://172.30.206.146:8383/macos-notarization-service/${UUID}/status")
      STATUS=$(echo "$RESPONSE" | grep -Po '"status"\s*:\s*"\K[^"]+' || : )
    done

    if [[ ${STATUS} != 'COMPLETE' ]]; then
      echo "Notarization failed: ${RESPONSE}"
      retryCount=$((retryCount - 1))
      if [ $retryCount -eq 0 ]; then
        echo "Notarization failed 3 times. Exiting"
        exit 1
      else
        echo "Retrying..."
        sleep 2
      fi
    else
      break
    fi

  done

  rm "${DMG}"

  curl -sSJO "http://172.30.206.146:8383/macos-notarization-service/${UUID}/download"
  popd || exit 5
  set +x
}
