#!/usr/bin/env bash
set -euo pipefail

ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
VERSION_FILE="$ROOT_DIR/VERSION"
MODULE_DIR="$ROOT_DIR/modules"
VERSION="$(cat "$VERSION_FILE")"

usage() {
  cat <<EOF
Replicator Toolkit $VERSION

Usage:
  replicator version
  replicator list
  replicator info <module>
  replicator verify <module>
  replicator install <module>
  replicator help

Commands:
  version   Show Replicator Toolkit version
  list      List available modules
  info      Show a module manifest
  verify    Verify a module
  install   Install or reproduce a module
  help      Show this help
EOF
}

module_path() {
  local module="${1:-}"
  module="${module%.yml}"
  module="${module#modules/}"
  printf '%s/%s/MANIFEST.yml\n' "$MODULE_DIR" "$module"
}

list_modules() {
  find "$MODULE_DIR" -type f -name MANIFEST.yml -print \
    | sed "s|^$MODULE_DIR/||; s|/MANIFEST.yml$||" \
    | sort
}

show_info() {
  local module="${1:-}"
  if [[ -z "$module" ]]; then
    echo "Usage: replicator info <module>" >&2
    exit 2
  fi

  local manifest
  manifest="$(module_path "$module")"

  if [[ ! -f "$manifest" ]]; then
    echo "Module not found: $module" >&2
    exit 1
  fi

  cat "$manifest"
}

case "${1:-help}" in
  version)
    echo "Replicator Toolkit $VERSION"
    ;;
  list)
    list_modules
    ;;
  info)
    show_info "${2:-}"
    ;;
  verify)
    module="${2:-}"
    case "$module" in
      digital/sovereign-node|digital.sovereign-node)
        exec "$MODULE_DIR/digital/sovereign-node/scripts/verify.sh"
        ;;
      "")
        echo "Usage: replicator verify <module>" >&2
        exit 2
        ;;
      *)
        echo "Module not found or not verifiable: $module" >&2
        exit 1
        ;;
    esac
    ;;
  install)
    module="${2:-}"

    case "$module" in
      digital/sovereign-node|digital.sovereign-node)
        exec "$MODULE_DIR/digital/sovereign-node/scripts/install.sh"
        ;;

      "")
        echo "Usage: replicator install <module>" >&2
        exit 2
        ;;

      *)
        echo "Module not found or not installable: $module" >&2
        exit 1
        ;;
    esac
    ;;
  help|-h|--help)
    usage
    ;;
  *)
    echo "Unknown command: $1" >&2
    echo >&2
    usage >&2
    exit 1
    ;;
esac
