#!/bin/sh

sed -i "s/EB_ENVIRONMENT/$EB_ENV/g" .elasticbeanstalk/config.yml

cat .elasticbeanstalk/config.yml

export DEPLOY_TIMESTAMP=$(date +%s)
export NODE_ENV=production
npm install
npm run deploy

aws s3 cp ./public/assets/$DEPLOY_TIMESTAMP s3://$S3_PATH/assets/$DEPLOY_TIMESTAMP --recursive --acl public-read --cache-control max-age=31536000
aws s3 sync ./public/vendor s3://$S3_PATH/vendor --acl public-read --cache-control max-age=31536000

zip -r mobile-analytics.zip . -x \*node_modules\* \*.git\* .gitignore \*public/{assets,vendor,js,img,css}\* \*sass\* .env.shadow README.md \*__tests__\* \*__fixtures__\* \*__mocks__\*

eb deploy $EB_ENV --label $BUILD_TAG --region us-east-1 --verbose
# setting timestamp here to have a consistent timestamp for all load balanced instances
eb setenv $(echo DEPLOY_TIMESTAMP=$DEPLOY_TIMESTAMP CDN_URL=$CDN_URL) -e $EB_ENV
eb labs cleanup-versions $EB_ENV --older-than $DELETE_APP_VERSIONS_OLDER_THAN_DAYS --num-to-leave $NUM_APP_VERSIONS_TO_KEEP --force


### Delete Old Asset Versions ###
### example path: /assets/1456349030/js/analytics.min.js (/assets/[versioned asset folder]/js/analytics.min.js) ###

# create an array with all versioned asset folders in ascending order
# Example aws s3 ls response:
# PRE 1456349030/
# PRE 1456349443/
# PRE 1456353751/
versionedAssetFolders=$(aws s3 ls s3://$S3_PATH/assets/ | sort)
deleteAssetVersionsOlderThanTimestamp=$(date --date="-${DELETE_ASSET_VERSIONS_OLDER_THAN_DAYS} days" +%s)
declare -a versionedAssetFolderNames
declare -a versionedAssetFolderNamesToDelete
while read -r versionedAssetFolder; do
    folderName=$(echo $versionedAssetFolder | sed "s/^PRE \([0-9]*\).*$/\1/")
    if [[ -n $folderName ]]; then
        versionedAssetFolderNames+=$folderName
        if [[ $folderName -ne $DEPLOY_TIMESTAMP ]] && [[ $folderName -lt $deleteAssetVersionsOlderThanTimestamp ]]; then
            versionedAssetFolderNamesToDelete+=($folderName)
        fi
    fi
done <<< "$versionedAssetFolders"

numVersionedAssetFolders=${#versionedAssetFolderNames[@]}
# if there are less than NUM_ASSET_VERSIONS_TO_KEEP versioned asset folders don't delete any of them
if [[ $numVersionedAssetFolders -gt $NUM_ASSET_VERSIONS_TO_KEEP ]]; then
    # calculate how many versioned asset folders can be deleted without reducing the
    # total number of versioned asset folders to less than NUM_ASSET_VERSIONS_TO_KEEP
    numVersionedAssetFoldersToDelete=${#versionedAssetFolderNamesToDelete[@]}
    numVersionedAssetFoldersToDelete=$(($numVersionedAssetFoldersToDelete - $(($numVersionedAssetFolders - $numVersionedAssetFoldersToDelete - $NUM_ASSET_VERSIONS_TO_KEEP))))

    # only delete the oldest numVersionedAssetFoldersToDelete versioned asset folders
    versionedAssetFolderNamesToDelete=(${versionedAssetFolderNamesToDelete[@]:0:numVersionedAssetFoldersToDelete})

    # delete versioned asset folders
    for folderName in "${versionedAssetFolderNamesToDelete[@]}"; do
        aws s3 rm s3://$S3_PATH/assets/$folderName/ --recursive
    done
fi
