#!/usr/bin/env bash
set -euo pipefail
source "$SHELLOPS_DIR/.envrc"

: <<'DOC'
Syncs the project manifest to a given semver version.

Updates latest, stable, and releases fields in manifest.json based on
whether the version is a release or prerelease.
DOC

import \
  "$SHELLOPS_DIR/lib/versions.api.sh" \
  "$SHELLOPS_DIR/lib/manifest.api.sh"

USAGE="$(cat <<EOF
Syncs the project manifest to match a given version.

Usage: ops sync-manifest <version>

Arguments:
  version         Semver version to set as latest (e.g. 1.2.3 or 1.2.3-dev.1)

Flags:
  -h, --help      Show this help text.

Behavior:
  - Sets 'latest' to the given version.
  - For release versions: sets 'stable' and increments 'releases'.
  - For prereleases: sets 'stable' to the latest release tag from git.
EOF
)"

ARG_VERSION=""

function main() {
  parse_args "$@"
  validate_version

  manifest_set latest "$ARG_VERSION"

  if is_release_version "$ARG_VERSION"; then
    manifest_set stable "$ARG_VERSION"
    manifest_set releases $(($(manifest_get releases) + 1))
  else
    manifest_set stable "$(latest_release_version)"
  fi

  log "Synced project manifest to v$(manifest_get latest)"
}

function validate_version() {
  if [[ -z "$ARG_VERSION" ]]; then
    error "version not supplied"
    log "$USAGE"
    exit 1
  fi

  if ! is_valid_semver "$ARG_VERSION"; then
    error "Not valid semver: '$ARG_VERSION'"
    exit 1
  fi
}

function parse_args() {
  while [[ $# -gt 0 ]]; do
    case "$1" in
      -h|--help) log "$USAGE" && exit 0 ;;
      -*)
        log "Unknown option: $1"
        log "$USAGE"
        exit 1
        ;;
      *) ARG_VERSION="$1" ;;
    esac
    shift
  done
}

main "$@"
