#!/usr/bin/env bash

# bdsm extend update [internal|<ext name>]
extend_update()
{
  name="${extension_args[0]}"
  case "${name:-help}" in
  all)
    extend_update_all
    ;;
  help)
    extend_help
    ;;
  *)
    extend_update_name "${name}"
    ;;
  esac
}

# update all external extensions
extend_update_all()
{
  extend_internal_update

  extensions_in ${bdsm_path}/extensions/external
  for name in ${found_extensions[@]}
  do
    extend_update_name "${name}"
  done
}

# bdsm extend update <ext name>
extend_update_name()
{
  name="$1"
  if in_search_paths detect_uri ${name}
  then
    extension_uri="$(cat ${uri_path})"
    log_search uri ${name} "${uri_path##${bdsm_path}\/extensions\/} including ${extension_uri}"
  else
    error "Could not find .uri for ${name}"
  fi
  extend_name_uri "${name}" "${extension_uri}"
}

# bdsm extend default <uri> [as] <local ext name>
extend_install()
{
  extension_uri="${extension_args[0]}"
  if [[ -z "${extension_uri}" ]]
  then
    extend_help
    return $?
  fi
  name="${extension_args[1]}"
  if [[ -z "${name}" ]]
  then
    fail "\"bdsm extend <name>\" is depracated, all bdsm-extensions are now available by default.\n\
    Use \"bdsm internal update\" to update internal bdsm extensdions."
  elif [[ "${name}" == "as" ]] && [[ -n "${extension_args[2]}" ]]
  then
    name="${extension_args[2]}"
  fi
  extend_name_uri "${name}" "${extension_uri}"
}

extend_name_uri()
{
  name="$1"
  extension_uri="$2"
  extension_identifier="$(scm_identifier "${extension_uri}")"
  extension_src_path="${extensions_src_path}/${extension_identifier}"

  # TODO: This should update to/from repos path and/or archives path...
  fetch_uri "${extension_uri}" "${extension_src_path}"
  extension_install "${name}" "${extension_identifier}"
}

extend_help()
{
  modules ext/help

  description "install BDSM extension"

  action "extend <uri> <name>" \
    "Install given extension from uri to name"

  action "extend update <name>" \
    "Update given name extension using latest used uri"

  action "extend update <name>" \
    "Update given all external extensions using latest used uris"

  action "extend update all" \
    "Update internal and externall extensions using latest used uris"

  show_help usage
}
