#!/bin/sh

beginsWith() { case $2 in "$1"*) true;; *) false;; esac; }

PATH=$(pwd)/bin:$PATH
export PATH

ENABLE_UPLOAD=$1
BITBUCKET_AUTH=$2
BITBUCKET_TESTING=$3

if [ "$BITBUCKET_TESTING" = "1" ]; then
  REPOSITORY=repertory-testing
else
  REPOSITORY=repertory-ui
fi

PRIVATE_KEY=../../blockstorage_dev_private.pem
PUBLIC_KEY=../blockstorage_dev_public.pem
APP_VER=$(grep -m1 -a version package.json|sed -e "s/\"//g" -e "s/version: //g" -e "s/,//g" -e "s/ //g")

if beginsWith darwin "$OSTYPE"; then
  DISTRO_LIST="darwin"
  OUT_FILE=repertory-ui_${APP_VER}_mac.dmg
  BASE64_EXEC=base64
  JQ_EXEC=jq-osx-amd64
  SHA256_EXEC="shasum -a 256 -b"
else
  DISTRO_LIST="centos7 debian9 debian10 solus"
  OUT_FILE=repertory-ui_${APP_VER}_linux_x86_64.AppImage
  BASE64_EXEC="base64 -w0"
  JQ_EXEC=jq-linux64
  SHA256_EXEC="sha256sum -b"
fi

exit_script() {
  echo $1
  exit 1
}

upload_to_bitbucket() {
  SOURCE_FILE=$1
  echo "Uploading ${SOURCE_FILE} to Bitbucket ${REPOSITORY}"
  curl --fail -u "${BITBUCKET_AUTH}" -X POST https://api.bitbucket.org/2.0/repositories/blockstorage/${REPOSITORY}/downloads -F files=@${SOURCE_FILE} > upload_response.json || exit_script "Upload to Bitbucket failed: ${SOURCE_FILE}"
}

chmod +x "bin/${JQ_EXEC}" || exit_script "chmod +x ${JQ_EXEC} failed"

npm install

if npm run dist; then
  cd dist
    ${SHA256_EXEC} ${OUT_FILE} > ${OUT_FILE}.sha256 || exit_script "Create sha256 failed"
    openssl dgst -sha256 -sign "${PRIVATE_KEY}" -out "${OUT_FILE}.sig" "${OUT_FILE}" || exit_script "Create signature failed"
    openssl dgst -sha256 -verify "${PUBLIC_KEY}" -signature "${OUT_FILE}.sig" "${OUT_FILE}" || exit_script "Verify signature failed"
    ${BASE64_EXEC} "${OUT_FILE}.sig" > "${OUT_FILE}.sig.b64" || exit_script "Create base64 failed"

    if [ "$ENABLE_UPLOAD" = "1" ]; then
      APP_SIG=$(cat ${OUT_FILE}.sig.b64)
      APP_SHA256=$(cat ${OUT_FILE}.sha256 | awk '{print $1;}')

      rm -f upload_response.json 1>/dev/null 2>&1
      curl --fail -F name="${OUT_FILE}" -F anonymous=true -F file="@${OUT_FILE}" https://pixeldrain.com/api/file > upload_response.json || exit_script "Upload to Pixeldrain failed"

      PIXEL_SUCCESS=$(${JQ_EXEC} .success upload_response.json)
      if [ "${PIXEL_SUCCESS}" = "false" ]; then
        PIXEL_MESSAGE=$(${JQ_EXEC} .message upload_response.json)
        exit_script "${PIXEL_MESSAGE}"
      else
        PIXEL_ID=$(${JQ_EXEC} .id upload_response.json|sed s/\"//g)
        PIXEL_LOCATION=https://pixeldrain.com/api/file/${PIXEL_ID}

        upload_to_bitbucket "${OUT_FILE}"
        upload_to_bitbucket "${OUT_FILE}.sha256"
        upload_to_bitbucket "${OUT_FILE}.sig"
        BITBUCKET_LOCATION=https://bitbucket.org/blockstorage/${REPOSITORY}/downloads/${OUT_FILE}

        cp -f ../releases.json ./releases.json
        for DISTRONAME in ${DISTRO_LIST}; do
          ${JQ_EXEC} ".Versions[\"${DISTRONAME}\"]|=(.+ [\"${APP_VER}\"]|unique)" releases.json > releases_temp.json || exit_script "Update releases.json Versions failed"
          ${JQ_EXEC} ".Locations[\"${DISTRONAME}\"].\"${APP_VER}\".sig=\"${APP_SIG}\"" releases_temp.json > releases.json || exit_script "Update releases.json sig failed"
          ${JQ_EXEC} ".Locations[\"${DISTRONAME}\"].\"${APP_VER}\".sha256=\"${APP_SHA256}\"" releases.json > releases_temp.json || exit_script "Update releases.json sha256 failed"
          ${JQ_EXEC} ".Locations[\"${DISTRONAME}\"].\"${APP_VER}\".urls=[\"${PIXEL_LOCATION}\",\"${BITBUCKET_LOCATION}\"]" releases_temp.json > releases.json || exit_script "Update releases.json URL failed"
        done
        rm -f releases_temp.json
      fi
    fi
  cd -
else
  exit_script "Create dist failed"
fi
