#!/bin/bash
#
# This assumes all of the OS-level configuration has been completed and git repo has already been cloned
#
# This script should be run from the repo's deployment directory
# cd deployment
# ./build-s3-dist.sh source-bucket-base-name solution-name version-code
#
# Paramenters:
#  - source-bucket-base-name: Name for the S3 bucket location where the template will source the Lambda
#    code from. The template will append '-[region_name]' to this bucket name.
#    For example: ./build-s3-dist.sh solutions my-solution v1.0.0
#    The template will then expect the source code to be located in the solutions-[region_name] bucket
#
#  - solution-name: name of the solution for consistency
#
#  - version-code: version of the package


# Check to see if input has been provided:
if [ -z "$1" ] || [ -z "$2" ] || [ -z "$3" ]; then
    echo "Please provide the base source bucket name, trademark approved solution name and version where the lambda code will eventually reside."
    echo "For example: ./build-s3-dist.sh solutions trademarked-solution-name v1.0.0"
    exit 1
fi

# Get reference for all important folders
template_dir="$PWD"
template_dist_dir="$template_dir/global-s3-assets"
build_dist_dir="$template_dir/regional-s3-assets"
source_dir="$template_dir/../source"

echo "------------------------------------------------------------------------------"
echo "[Init] Clean old dist, node_modules and bower_components folders"
echo "------------------------------------------------------------------------------"
echo "rm -rf $template_dist_dir"
rm -rf $template_dist_dir
echo "mkdir -p $template_dist_dir"
mkdir -p $template_dist_dir
echo "rm -rf $build_dist_dir"
rm -rf $build_dist_dir
echo "mkdir -p $build_dist_dir"
mkdir -p $build_dist_dir

echo "------------------------------------------------------------------------------"
echo "[Packing] Templates"
echo "------------------------------------------------------------------------------"
echo "cp $template_dir/*.template $template_dist_dir/"
cp $template_dir/*.template $template_dist_dir/
echo "copy yaml templates and rename"
cp $template_dir/*.yaml $template_dist_dir/
cd $template_dist_dir
# Rename all *.yaml to *.template
for f in *.yaml; do
    mv -- "$f" "${f%.yaml}.template"
done

cd ..
echo "Updating code source bucket in template with $1"
replace="s/%%BUCKET_NAME%%/$1/g"
echo "sed -i '' -e $replace $template_dist_dir/*.template"
sed -i '' -e $replace $template_dist_dir/*.template
replace="s/%%SOLUTION_NAME%%/$2/g"
echo "sed -i '' -e $replace $template_dist_dir/*.template"
sed -i '' -e $replace $template_dist_dir/*.template
replace="s/%%VERSION%%/$3/g"
echo "sed -i '' -e $replace $template_dist_dir/*.template"
sed -i '' -e $replace $template_dist_dir/*.template

# Archive and copy kvs_transcribe_streaming_lambda directory to $source_dir
echo "Archiving kvs_transcribe_streaming_lambda directory"
cd $source_dir/../source
zip -r kvs_transcribe_streaming_fargate.zip kvs_transcribe_streaming_lambda
cp kvs_transcribe_streaming_fargate.zip $build_dist_dir/kvs_transcribe_streaming_fargate.zip
rm -rf kvs_transcribe_streaming_fargate.zip
cd $source_dir

# Archive and copy transcribing_fargate_trigger lambda function to $source_dir
echo "Archiving transcribing_fargate_trigger lambda function"
cd $source_dir/../source/transcribing_fargate_trigger
zip lambda_transcribing_fargate_trigger.zip lambda_transcribing_fargate_trigger.py
cp lambda_transcribing_fargate_trigger.zip $build_dist_dir/lambda_transcribing_fargate_trigger.zip
rm -rf lambda_transcribing_fargate_trigger.zip
cd $source_dir

# Archive and copy start_codebuild lambda function to $source_dir
echo "Archiving start_codebuild lambda function"
cd $source_dir/../source/start_codebuild
pip install --target ./package cfnresponse
zip -r lambda_start_codebuild.zip ./package/
zip -g lambda_start_codebuild.zip lambda_start_codebuild.py
zip lambda_start_codebuild.zip lambda_start_codebuild.py
cp lambda_start_codebuild.zip $build_dist_dir/lambda_start_codebuild.zip
rm -rf lambda_start_codebuild.zip
cd $source_dir

# Build node.js CFN Lambda custom resource helper function
echo "Building CFN custom resource helper Lambda function"
cd $source_dir/../source/helper
npm install
npm run build
npm run zip
# Copy packaged Lambda function to $build_dist_dir
cp ./dist/custom-resource-helper.zip $build_dist_dir/custom-resource-helper.zip
# Remove temporary build files
rm -rf dist
rm -rf node_modules
# Done, so go back to deployment_dir
cd $source_dir

# Build node.js contact_init function
echo "Building contact_init function"
cd $source_dir/../source/contact_init
npm install
npm run build
npm run zip
# Copy packaged Lambda function to $build_dist_dir
cp ./dist/contact_init.zip $build_dist_dir/contact_init.zip
# Remove temporary build files
rm -rf dist
rm -rf node_modules
# Done, so go back to deployment_dir
cd $source_dir

# Build node.js create_contact_flow function
echo "Building create_contact_flow function"
cd $source_dir/../source/create_contact_flow
npm install
npm run build
npm run zip
# Copy packaged Lambda function to $build_dist_dir
cp ./dist/create_contact_flow.zip $build_dist_dir/create_contact_flow.zip
# Remove temporary build files
rm -rf dist
rm -rf node_modules
# Done, so go back to deployment_dir
cd $source_dir

# Build node.js kvs_trigger function
echo "Building kvs_trigger function"
cd $source_dir/../source/kvs_trigger
npm install
npm run build
npm run zip
# Copy packaged Lambda function to $build_dist_dir
cp ./dist/kvs_trigger.zip $build_dist_dir/kvs_trigger.zip
# Remove temporary build files
rm -rf dist
rm -rf node_modules
# Done, so go back to deployment_dir
cd $source_dir

# Build node.js process_contact function
echo "Building process_contact function"
cd $source_dir/../source/process_contact
npm install
npm run build
npm run zip
# Copy packaged Lambda function to $build_dist_dir
cp ./dist/process_contact.zip $build_dist_dir/process_contact.zip
# Remove temporary build files
rm -rf dist
rm -rf node_modules
# Done, so go back to deployment_dir
cd $source_dir

# Build node.js ws_realtime_transcribe_Default function
echo "Building ws_realtime_transcribe_Default function"
cd $source_dir/../source/ws_realtime_transcribe_Default
npm install
npm run build
npm run zip
# Copy packaged Lambda function to $build_dist_dir
cp ./dist/ws_realtime_transcribe_Default.zip $build_dist_dir/ws_realtime_transcribe_Default.zip
# Remove temporary build files
rm -rf dist
rm -rf node_modules
# Done, so go back to deployment_dir
cd $source_dir

# Build node.js ws_realtime_transcribe_OnConnect function
echo "Building ws_realtime_transcribe_OnConnect function"
cd $source_dir/../source/ws_realtime_transcribe_OnConnect
npm install
npm run build
npm run zip
# Copy packaged Lambda function to $build_dist_dir
cp ./dist/ws_realtime_transcribe_OnConnect.zip $build_dist_dir/ws_realtime_transcribe_OnConnect.zip
# Remove temporary build files
rm -rf dist
rm -rf node_modules
# Done, so go back to deployment_dir
cd $source_dir

# Build node.js ws_realtime_transcribe_OnDDBInsert function
echo "Building ws_realtime_transcribe_OnDDBInsert function"
cd $source_dir/../source/ws_realtime_transcribe_OnDDBInsert
npm install
npm run build
npm run zip
# Copy packaged Lambda function to $build_dist_dir
cp ./dist/ws_realtime_transcribe_OnDDBInsert.zip $build_dist_dir/ws_realtime_transcribe_OnDDBInsert.zip
# Remove temporary build files
rm -rf dist
rm -rf node_modules
# Done, so go back to deployment_dir
cd $source_dir

# Build node.js ws_realtime_transcribe_OnDisconnect function
echo "Building ws_realtime_transcribe_OnDisconnect function"
cd $source_dir/../source/ws_realtime_transcribe_OnDisconnect
npm install
npm run build
npm run zip
# Copy packaged Lambda function to $build_dist_dir
cp ./dist/ws_realtime_transcribe_OnDisconnect.zip $build_dist_dir/ws_realtime_transcribe_OnDisconnect.zip
# Remove temporary build files
rm -rf dist
rm -rf node_modules
# Done, so go back to deployment_dir
cd $source_dir

# Build node.js ws_realtime_transcribe_OnMessage function
echo "Building ws_realtime_transcribe_OnMessage function"
cd $source_dir/../source/ws_realtime_transcribe_OnMessage
npm install
npm run build
npm run zip
# Copy packaged Lambda function to $build_dist_dir
cp ./dist/ws_realtime_transcribe_OnMessage.zip $build_dist_dir/ws_realtime_transcribe_OnMessage.zip
# Remove temporary build files
rm -rf dist
rm -rf node_modules
# Done, so go back to deployment_dir
cd $source_dir

# Build kvs_transcribe_streaming_lambda function to $source_dir
cd $source_dir/../source/kvs_transcribe_streaming_lambda
gradle build
cp ./build/distributions/kvs_transcribe_streaming_lambda.zip $build_dist_dir/

# Build node.js updateContactAttributes function
echo "Building updateContactAttribes function"
cd $source_dir/../source/update_contact_attributes
npm install
npm run build
npm run zip
# Copy packaged Lambda function to $build_dist_dir
cp ./dist/update_contact_attributes.zip $build_dist_dir/update_contact_attributes.zip
# Remove temporary build files
rm -rf dist
rm -rf node_modules
# Done, so go back to deployment_dir
cd $source_dir

# Copy website files to $build_dist_dir
echo "Copying web site content to $source_dir"
cp -r $source_dir/../source/web_site $build_dist_dir/

# Generate a manifest for web site files
echo "Generating web site manifest"
cd $source_dir/../deployment/manifest-generator
npm install
node app.js
# Done, so go back to deployment_dir
cd $source_dir