#!/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

# computed environment variables
SKIA_DEPENDENCIES_DIR="$RIVE_RUNTIME_DIR/skia/dependencies"
SKIA_DIR="$SKIA_DEPENDENCIES_DIR/$SKIA_DIR_NAME"

# gotta switch into a non .git folder to check the remote repo's hash
# this avoid issues with corrupted git repos throwing irrelevant errors
pushd ~
SKIA_COMMIT_HASH="$(git ls-remote $SKIA_REPO $SKIA_BRANCH | awk '{print $1}')"
popd 

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
}