#!/usr/bin/env bash

OYA_URL="https://github.com/tooploox/oya"
OYA_LATEST_RELEASE_URL="https://api.github.com/repos/tooploox/oya/releases/latest"
INSTALL_DIR="/usr/local/bin"
verifySHA=true

check_sops() {
    printf " Sops -> "
    if hash sops 2>/dev/null; then
        printf "OK ($(sops --version))\n"
    else
        printf "FAIL\n"
        echo "Oya requires SOPS (Secrets OPerationS) to manage secret files."
        echo "Visit https://github.com/mozilla/sops for install instructions."
        exit 1
    fi
}

check_sha256sum() {
    printf " Sha256sum -> "
    if hash sha256sum 2>/dev/null; then
        printf "OK\n"
    else
        printf "FAIL\n"
        echo "WARN: Command sha256sum not found. Oya binaries checksum will not be verified!"
        verifySHA=false
    fi
}

check_deps() {
    echo "Checking required tools:"
    check_sops
    check_sha256sum
}

get_os() {
    unamestr=`uname`
    if [[ "$unamestr" == 'Linux' ]]; then
        os='linux'
        return 0
    elif [[ "$unamestr" == 'Darwin' ]]; then
        os='darwin'
        return 0
    else
        echo "Sorry Oya doesn't support ${unamestr} yet! :("
        exit 1
    fi
}

get_arch() {
    archstr=`uname -m`
    if [[ "$archstr" == 'x86' ]]; then
        arch='386'
    elif [[ "$archstr" == 'x86_64' || "$archstr" == 'AMD64' ]]; then
         arch='amd64'
    elif [[ "$archstr" == 'arm64' ]]; then
         arch='arm64'
    else
        echo "Sorry Oya doesn't support ${archstr} architecture yet! :("
        exit 1
    fi
}

find_latest() {
    version="$(fetch_latest_release_tag)"
    if [[ -n ${version} ]];then
        echo "${version}"
        return 0
    fi
}

fetch_latest_release_tag() {
    curl -s ${OYA_LATEST_RELEASE_URL} | awk -v RS=',' -v FS='"' '$2=="tag_name"{print $4}'
}

install_version() {
    _ver=$1
    _os=$2
    _arch=$3
    _url="${OYA_URL}/releases/download/${_ver}/oya_${version}_${_os}_${_arch}.gz"
    _sum_url="${OYA_URL}/releases/download/${_ver}/oya_${version}_SHA256SUMS"
    echo "Installing Oya ${_ver}"
    get_and_check "${_url}" "${_sum_url}" && return
}

get_and_check() {
    _url=$1
    _sum_url=$2
    _tmp_dir=`mktemp -d`
    _archive="oya.gz"
    _fileName="oya"
    _args=""
    get_package "$_url" "$_tmp_dir" "$_archive" || return $?
    verify_sha "$_sum_url" "$_tmp_dir" "$_archive" || return $?
    gunzip ${_tmp_dir}/${_archive} || return $?
    chmod +x ${_tmp_dir}/${_fileName} || return $?
    if [ ! -w "$INSTALL_DIR" ]; then
        _args="sudo "
    fi
    ${_args}mv ${_tmp_dir}/${_fileName} ${INSTALL_DIR}
}

get_package() {
    _url=$1; _dir=$2; _file=$3
    curl -sSL ${_url} > ${_dir}/${_file} ||
        {
            echo "error downloading oya package $url"
            return 1
        }
}

verify_sha() {
    if [[ "$verifySHA" == false ]]; then
        return
    fi
    echo " Checking SHA checksum."
    _url=$1; _dir=$2; _file=$3
    curl -sSL ${_url} > ${_dir}/shasums ||
        {
            echo "error downloading oya package SHA sums $url"
            return 1
        }
    _mysum=$(sha256sum ${_dir}/${_file} | awk '{print $1}')
    _result=$(cat ${_dir}/shasums | grep $_mysum)
    if [ -z "$_result" ]; then
        echo "downloaded archive checksum failed"
        return 1
    fi
}

oya_install() {
    get_os
    get_arch
    check_deps
    if [ -z "$1" ];then
        version=$(find_latest)
    else
        version=$1
    fi
    install_version $version $os $arch
    echo "Done."
}

oya_install "$@"
