#!/bin/bash

set -e

PATH="${PATH}:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"

FD_CACHE_CONTROL="max-age=86400,must-revalidate"
FD_CONTENT_TYPE=""
FD_CDN_PURGE_URL=""
FD_FIND_OPTS=()
FD_IS_DIR=0

USAGE="
    ${0} -c <content-type> -C <cache-control> -P <purge-uri> -s <src> -d <dst>
"

while getopts 'hc:C:P:s:d:' OPT;
do
    case ${OPT} in
    h)
        echo ${USAGE}
        exit 0
        ;;
    c)
        FD_CONTENT_TYPE="${OPTARG}"
        ;;
    C)
        FD_CACHE_CONTROL="${OPTARG}"
        ;;
    P)
        FD_CDN_PURGE_URL="${OPTARG}"
        ;;
    s)
        FD_SRC_PATH="$(realpath "${OPTARG}")"
        ;;
    d)
        FD_DST_PATH="$(echo -n "${OPTARG}"|sed 's/\/\+$//')"
        ;;
    :)
        echo "Option -${OPTARG} requires an argument." >&2
        exit 1
        ;;
    esac
done

if [ ! -d "${FD_SRC_PATH}" ];
then
    FD_FIND_OPTS=("-name" "$(basename "${FD_SRC_PATH}")")
    pushd "$(dirname "${FD_SRC_PATH}")" > /dev/null
else
    FD_IS_DIR=1
    pushd "${FD_SRC_PATH}" > /dev/null
fi

trap "popd > /dev/null || true" EXIT ERR

find -type f ${FD_FIND_OPTS[@]} -print0|while read -d $'\0' file;
do
    case "${file}" in
        *.css)
            CONTENT_TYPE="text/css";
        ;;
        *.eot)
            CONTENT_TYPE="application/vnd.ms-fontobject";
        ;;
        *.gif)
            CONTENT_TYPE="image/gif";
        ;;
        *.tar.gz|*.tgz)
            CONTENT_TYPE="application/x-gtar";
        ;;
        *.gz)
            CONTENT_TYPE="application/gzip";
        ;;
        *.ico)
            CONTENT_TYPE="image/x-icon";
        ;;
        *.jpg|*.jpeg)
            CONTENT_TYPE="image/jpeg";
        ;;
        *.js)
            CONTENT_TYPE="application/javascript";
        ;;
        *.json)
            CONTENT_TYPE="application/json";
        ;;
        *.htm|*.html)
            CONTENT_TYPE="text/html";
        ;;
        *.map)
            CONTENT_TYPE="application/octet-stream";
        ;;
        *.png)
            CONTENT_TYPE="image/png";
        ;;
        *.svg)
            CONTENT_TYPE="image/svg+xml";
        ;;
        *.ttf)
            CONTENT_TYPE="font/ttf";
        ;;
        *.txt)
            CONTENT_TYPE="text/plain";
        ;;
        *.woff)
            CONTENT_TYPE="application/font-woff";
        ;;
        *.woff2)
            CONTENT_TYPE="application/font-woff2";
        ;;
        *.xml)
            CONTENT_TYPE="text/xml";
        ;;
        *.zip)
            CONTENT_TYPE="application/zip";
        ;;
        *)
            CONTENT_TYPE="${FD_CONTENT_TYPE}"
        ;;
    esac;

    if [ ! -z "${FD_CONTENT_TYPE}" ];
    then
        CONTENT_TYPE="${FD_CONTENT_TYPE}"
    fi

    if [ -z "${CONTENT_TYPE}" ];
    then
        CONTENT_TYPE="application/octet-stream"
    fi

    FD_S3_OPTS=("--no-progress"
                "--content-type" "${CONTENT_TYPE}"
                "--cache-control" "${FD_CACHE_CONTROL}")

    if [ ${FD_IS_DIR} -eq 1 ];
    then
        FD_DST_FILEPATH="$(echo -n "$(dirname "${file}"|sed 's/^\.//')")/$(basename "${file}")"
    else
        FD_DST_FILEPATH=""
    fi

    aws s3 cp ${FD_S3_OPTS[@]} "${file}" "${FD_DST_PATH}${FD_DST_FILEPATH}"

    if [ ! -z "${FD_CDN_PURGE_URL}" ];
    then
        pfile="$(echo -n "${FD_DST_PATH}"|sed 's/\/\/\+/\//g'|cut -d'/' -f3-)${FD_DST_FILEPATH}"
        echo "Purge CDN path: ${pfile}"
        curl -s -G -o /dev/null "${FD_CDN_PURGE_URL}" --data-urlencode "p=${pfile}" || true
    fi
done
