#!/usr/bin/env bash

# These scripts are for the release process of the android app.
# They are:
# 1. add_release, Add a new supported release to android.json
# 2. set_latest_stable, Set a version to be the latest stable version. Needs to be supported.
# 3. remove_release, removes a release from android.json, marking it as unsupported.

set -eu

SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
cd "$SCRIPT_DIR"

REPO_ROOT=../../../

# The hostname (can be the alias in your ~/.ssh/config) of the build server
BUILDSERVER_HOST=$1
# The server to upload the metadata to *from* the build server (argument above)
METADATA_SERVER_HOST=$2

# shellcheck source=android/scripts/release/release-config.sh
source "$SCRIPT_DIR/release-config.sh"
source $REPO_ROOT/scripts/utils/log

print_usage() {
  log "Usage: release <option>"
  log "Where option is one of the following flags:"
  log "    -a, --add-release"
  log "              Add new release to the metada file and publish it to releases.mullvad.net"
  log "    -s, --set-latest-stable"
  log "              Update the latest.json file on release.mullvad.net"
  log "    -r, --remove-release"
  log "              Remove release to the metadata file and publish it to release.mullvad.net."
  log "              This will cause this release to be shown as unsupported."
  log "    -h, --help"
  log "              Show this help page."
}

function main {
    if [[ $# -eq 0 ]]; then
        print_usage
        exit 1
    fi

    if [[ $# -gt 5 ]]; then
        log_error "Too many arguments"
        print_usage
        exit 1
    fi

    case "$3" in
    "-a"|"--add-release")
        add_release "$4"
        ;;
    "-s"|"--set-latest-stable")
        set_latest_stable_version "$4"
        ;;
    "-r"|"--remove-release")
        remove_release "$4"
        ;;
    "-h"|"--help")
        print_usage
        exit 0
        ;;
    *)
        log_error "Invalid argument: \`$3\`"
        print_usage
        exit 1
        ;;
    esac
}

function clean_old_data {
    rm -rf "$WORK_DIR"
    rm -rf "$PUBLISHED_DIR"

    mkdir -p "$DATA_DIR"
}

MULLVAD_RELEASE="cargo run -q --package mullvad-release-android --"

function add_release {
    version=$1

    clean_old_data

    log_header "Fetching current version metadata"
    $MULLVAD_RELEASE pull --assume-yes

    log_header "Backing up released data"
    cp -r "$WORK_DIR" "$PUBLISHED_DIR"

    log_header "Adding new release $version"
    $MULLVAD_RELEASE add-release "$version"

    log_header "New metadata including $version"
    git --no-pager diff --no-index -- "$PUBLISHED_DIR" "$WORK_DIR" || true

    read -rp "Press enter to upload if the diffs look good "
    ./publish-metadata-to-api "$WORK_DIR" "$BUILDSERVER_HOST" "$METADATA_SERVER_HOST"
}

function set_latest_stable_version {
    version=$1

    clean_old_data

    log_header "Fetching current version metadata and latest version file"
    $MULLVAD_RELEASE pull --assume-yes --latest-file

    log_header "Backing up released data"
    cp -r "$WORK_DIR" "$PUBLISHED_DIR"

    log_header "Set stable $version in latest.json"
    $MULLVAD_RELEASE set-latest-stable-version "$version"

    log_header "New latest file"
    git --no-pager diff --no-index -- "$PUBLISHED_DIR" "$WORK_DIR" || true

    read -rp "Press enter to upload if the diffs look good "
    ./publish-metadata-to-api "$WORK_DIR" "$BUILDSERVER_HOST" "$METADATA_SERVER_HOST"
}

function remove_release {
    version=$1

    clean_old_data

    log_header "Fetching current version metadata"
    $MULLVAD_RELEASE pull --assume-yes

    log_header "Backing up released data"
    cp -r "$WORK_DIR" "$PUBLISHED_DIR"

    log_header "Removing new release $version"
    $MULLVAD_RELEASE remove-release "$version"

    log_header "New metadata without $version"
    git --no-pager diff --no-index -- "$PUBLISHED_DIR" "$WORK_DIR" || true

    read -rp "Press enter to upload if the diffs look good "
    ./publish-metadata-to-api "$WORK_DIR" "$BUILDSERVER_HOST" "$METADATA_SERVER_HOST"
}

# Run script
main "$@"
