#!/bin/bash
set -e

function upload_with_content_type() {
  content_type=$1
  bucket=$2
  shift 2
  content_type_options=""
  if [[ "$content_type" != "-" ]]; then
    content_type_options="-h Content-Type:${content_type};charset=utf-8"
  fi

  # DOCS for gsutil -- it does not have long command line flags!
  ## global flags
  # -h NAME:VALUE   add header, can occur multiples times
  # -m              upload with multiple threads
  ## rsync flags
  # -r              traverse into directories recursively
  # -x              Python regex for excluding files from the sync
  gsutil \
    -h "Cache-Control:public, max-age=31536000" \
    ${content_type_options} \
    -m \
    rsync \
    -r \
    "$@" \
    "/tmp/public/" \
    "${bucket}/public/"
}
function upload_into_bucket() {
  bucket=$1

  # stylesheets
  upload_with_content_type 'text/css' "$bucket" \
    -x '.+(?<!\.css)$'

  # javascript files
  upload_with_content_type 'application/javascript' "$bucket" \
    -x '.+(?<!\.js)$'

  # the rest
  upload_with_content_type '-' "$bucket" \
    -x '.+\.(css|js)$'

}

# Upload to staging CDN if branch is either 'master' or 'staging-master' or main variants
if [[ "$BRANCH_NAME" == "master" || "$BRANCH_NAME" == "staging-master" || "$BRANCH_NAME" == "main" || "$BRANCH_NAME" == "staging-main" ]]; then
  tar --directory=/tmp/ -xf build.tar

  # delete source maps
  find /tmp/public -name '*.js.map' -delete

  upload_into_bucket $CDN_STAG
  # Only upload to production CDN if branch is
  if [[ "$BRANCH_NAME" == "master" || "$BRANCH_NAME" == "main" ]]; then
    upload_into_bucket $CDN_PROD
  fi
fi


