#!/bin/bash

set -e

# required envs
RIVE_RUNTIME_DIR="${RIVE_RUNTIME_DIR:=../..}"
SKIA_DIR_NAME="${SKIA_DIR_NAME:=skia}"
SKIA_REPO=${SKIA_REPO:-https://github.com/rive-app/skia}
SKIA_BRANCH=${SKIA_BRANCH:-rive}
COMPILE_TARGET="${COMPILE_TARGET:-$(uname -s)_$(uname -m)}"
CACHE_NAME="${CACHE_NAME:=skia}"
OUTPUT_CACHE="${OUTPUT_CACHE:=out}"
MAKE_SKIA_FILE="${MAKE_SKIA_FILE:=make_skia_android.sh}"
ARCHIVE_CONTENTS_NAME="${ARCHIVE_CONTENTS_NAME:=archive_contents}"

# lets just make sure this exists, or fail
if [[ ! -d $RIVE_RUNTIME_DIR ]]
then
    echo "Cannot find $RIVE_RUNTIME_DIR, bad setup"
    exit 1
fi

# determeined envs
SKIA_DEPENDENCIES_DIR="$RIVE_RUNTIME_DIR/skia/dependencies"
SKIA_DIR="$SKIA_DEPENDENCIES_DIR/$SKIA_DIR_NAME"

SKIA_COMMIT_HASH="$(git ls-remote $SKIA_REPO $SKIA_BRANCH | awk '{print $1}')"

ARCHIVE_CONTENTS_PATH="$SKIA_DIR/$ARCHIVE_CONTENTS_NAME"
echo $ARCHIVE_CONTENTS_PATH

ARCHIVE_CONTENTS="missing"
if test -f "$ARCHIVE_CONTENTS_PATH"; then
    ARCHIVE_CONTENTS="$(cat $ARCHIVE_CONTENTS_PATH)"
fi

# TODO: could add OS_RELEASE in if portability is a problem
# TODO: hmm how do we know the make skia script.. i guess its an arg? a back arg?
if [[ $OSTYPE == 'darwin'* ]]; then
    # md5 -r == md5sum
    CONFIGURE_VERSION=$(md5 -r cache_helper.sh|awk '{print $1}')
    MAKE_SKIA_HASH=$(md5 -r $SKIA_DEPENDENCIES_DIR/$MAKE_SKIA_FILE|awk '{print $1}')
    BUILD_HASH=$(md5 -r -s "$SKIA_COMMIT_HASH $MAKE_SKIA_HASH $CONFIGURE_VERSION" | awk '{print $1}')
else 
    CONFIGURE_VERSION=$(md5sum cache_helper.sh|awk '{print $1}')
    MAKE_SKIA_HASH=$(md5sum $SKIA_DEPENDENCIES_DIR/$MAKE_SKIA_FILE|awk '{print $1}')
    BUILD_HASH=$(echo "$SKIA_COMMIT_HASH $MAKE_SKIA_HASH $CONFIGURE_VERSION" | md5sum | awk '{print $1}')
fi

echo "Created hash: $BUILD_HASH from skia_commit=$SKIA_COMMIT_HASH make_skia_script=$MAKE_SKIA_HASH configure_script=$CONFIGURE_VERSION"

EXPECTED_ARCHIVE_CONTENTS="$BUILD_HASH"_"$COMPILE_TARGET"

ARCHIVE_FILE_NAME="$CACHE_NAME"_"$EXPECTED_ARCHIVE_CONTENTS.tar.gz"
ARCHIVE_URL="https://cdn.2dimensions.com/archives/$ARCHIVE_FILE_NAME"
ARCHIVE_PATH="$SKIA_DIR/$ARCHIVE_FILE_NAME"

pull_cache() {
    echo "Grabbing cached build from $ARCHIVE_URL"
    mkdir -p $SKIA_DIR
    curl --output $SKIA_DIR/$ARCHIVE_FILE_NAME $ARCHIVE_URL 
    pushd $SKIA_DIR
    tar -xf $ARCHIVE_FILE_NAME out include $ARCHIVE_CONTENTS_NAME third_party
}

is_build_cached_remotely() {
    echo "Checking for cache build $ARCHIVE_URL"
    if curl --output /dev/null --head --silent --fail $ARCHIVE_URL
    then 
        return 0
    else 
        return 1
    fi
}

upload_cache() {
    pushd $SKIA_DEPENDENCIES_DIR
    echo $EXPECTED_ARCHIVE_CONTENTS > $SKIA_DIR_NAME/$ARCHIVE_CONTENTS_NAME
    # not really sure about this third party biz
    # also we are caching on a per architecture path here, but out could contain more :thinking:
    tar -C $SKIA_DIR_NAME -cf $SKIA_DIR_NAME/$ARCHIVE_FILE_NAME $OUTPUT_CACHE $ARCHIVE_CONTENTS_NAME include third_party/libpng third_party/externals/libpng
    popd
    # # if we're configured to upload the archive back into our cache, lets do it! 
    echo "Uploading to s3://2d-public/archives/$ARCHIVE_FILE_NAME"
    ls $ARCHIVE_PATH
    aws s3 cp $ARCHIVE_PATH s3://2d-public/archives/$ARCHIVE_FILE_NAME
}



is_build_cached_locally() {
    if [ "$EXPECTED_ARCHIVE_CONTENTS" == "$ARCHIVE_CONTENTS" ]; then 
        return 0
    else
        return 1
    fi
}