set -euo pipefail

SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
ARCH=$(uname -m)
PROJECT="$(basename "${SCRIPT_DIR}")"
OUTPUT="${SCRIPT_DIR}/output"


function heading() {
  # print a heading with a line of dashe
  echo "--------------------------------"
  echo "$1"
  echo "--------------------------------"
}

#--------------------------------------------------------------------------------
heading "Publishing ${PROJECT}"

function die() {
    heading "error: $1"
    exit 1
}

[[ -n $SOS_WRITE_TOKEN ]] || die "SOS_WRITE_TOKEN not specified"

# clear output dir
rm -rf "${OUTPUT}" 
mkdir -p "${OUTPUT}"


#--------------------------------------------------------------------------------
heading "Building ${PROJECT}"

# build release version
export CMAKE_BUILD_TYPE="Release"
"${SCRIPT_DIR}/build.sh"
[ -f "${OUTPUT}/${PROJECT}" ] || die "Build failed."

# install getpkg
GETPKG_PATH="${HOME}/.local/bin/getpkg/getpkg"
if [ ! -f "${GETPKG_PATH}" ]; then
    heading "Installing getpkg"
    curl https://getbin.xyz/getpkg-install | bash
    if [ ! -f "${GETPKG_PATH}" ]; then
        die "getpkg failed to install to ${GETPKG_PATH}"
    fi
fi

#--------------------------------------------------------------------------------
heading "Publishing ${PROJECT} as tool to ${PROJECT}:${ARCH} (on getpkg.xyz)"

TOOLDIR="${OUTPUT}/tool"
mkdir "${TOOLDIR}"
cp "${OUTPUT}/${PROJECT}" "${TOOLDIR}/${PROJECT}"
"${GETPKG_PATH}" server set-token getpkg.xyz "${SOS_WRITE_TOKEN}"
"${GETPKG_PATH}" publish "${PROJECT}:${ARCH}" "${TOOLDIR}"

#--------------------------------------------------------------------------------
heading "Publishing ${PROJECT} to getbin.xyz"

# Download sos if not already present
SOS="${OUTPUT}/sos"
if [ ! -f "${SOS}" ]; then
    heading "Downloading sos tool"
    curl -L -s -o "${SOS}" "https://getbin.xyz/sos:latest" || die "Failed to download sos"
    chmod +x "${SOS}"
fi

# Upload architecture-specific binary to getbin.xyz
heading "Uploading ${PROJECT} binary to getbin.xyz as ${PROJECT}:latest-${ARCH}"
"${SOS}" upload "getbin.xyz" "${OUTPUT}/${PROJECT}" "${PROJECT}:latest-${ARCH}" || die "Failed to upload ${PROJECT} binary to getbin.xyz"

# Check if there's an install script to upload
if [ -f "${SCRIPT_DIR}/install.sh" ]; then
    heading "Uploading install.sh to getbin.xyz as ${PROJECT}-install:latest"
    "${SOS}" upload "getbin.xyz" "${SCRIPT_DIR}/install.sh" "${PROJECT}-install:latest" || die "Failed to upload install script to getbin.xyz"
fi

heading "Successfully published ${PROJECT} to both getpkg.xyz and getbin.xyz"
