#compdef shortcuts

_shortcuts() {
  local curcontext="$curcontext"
  local -a line state

  _arguments -C \
    "1: :->subcommand" \
    "*:: :->args"

  case $state in
  subcommand)
    _values "subcommand" \
      "run[run a shortcut]" \
      "list[list your shortcuts]" \
      "view[view a shortcut in shortcuts]" \
      "sign[sign a shortcut file]" \
      "help[show subcommand help information]"
    ;;
  args)
    case ${line[1]} in
    run)
      _shortcuts-run
      ;;
    list)
      _shortcuts-list
      ;;
    view)
      _shortcuts-view
      ;;
    sign)
      _shortcuts-sign
      ;;
    help)
      _shortcuts-help
      ;;
    esac
    ;;
  esac
}

_shortcuts-run() {
  _arguments \
    ":shortcut name or identifier:$(_shortcut_options)" \
    {-i,--input-path}'[specify input to provide to the shortcut]:input path:_files' \
    {-o,--output-path}'[specify where to write the shortcut output, if applicable]:output path:_files' \
    '--output-type[specify type to output data in]:output type (Universal Type Identifier format)' \
    {-h,--help}'[show help information]'
}

_shortcuts-list() {
  _arguments \
    {-f,--folder-name}"[specify folder name or identifier to list shortcuts in, or \"none\" to list shortcuts not in a folder]:folder name:$(_shortcut_folder_options)" \
    '--folders[list folders instead of shortcuts]' \
    '--show-identifiers[show identifiers with each result]' \
    {-h,--help}'[show help information]'
}

_shortcuts-view() {
  _arguments \
    ":shortcut name:$(_shortcut_options)" \
    {-h,--help}'[show help information]'
}

_shortcuts-sign() {
  _arguments \
    {-m,--mode}'[specify signing mode]:mode [people-who-know-me]:(anyone people-who-know-me)' \
    {-i,--input}'[specify shortcut file to sign]:input:_files -g "*.shortcut(-.)"' \
    {-o,--output}'[specify output path for the signed shortcut file]:output:_files -g "*.shortcut(-.)"' \
    {-h,--help}'[show help information]'
}

_shortcuts-help() {
  _arguments \
    ":subcommand:(run list view sign help)"
}

# utilities

_shortcut_options() {
  echo "($(shortcuts list | sed 's/ /\\ /g'))"
}

_shortcut_folder_options() {
  echo "($(shortcuts list --folders | sed 's/ /\\ /g') none)"
}

_shortcuts "$@"
