#compdef distrobox

_distrobox() {
  local context curcontext="$curcontext" state line ret=1
  typeset -A opt_args

  _arguments -C \
    '(-h --help)'{-h,--help}'[show help]' \
    '(-V --version)'{-V,--version}'[show version]' \
    '1: :->command' \
    '*:: :->arguments'

  case $state in;
    (command)
      local commands;
      commands=(
        'create:create the distrobox'
        'enter:enter the distrobox'
        'export:application and service exporting'
        'list:list containers'
        'rm:remove containers'
        'stop:stop containers'
      )
      _describe -t commands 'distrobox command' commands "$@" \
        && ret=0 ;;

    (arguments)
      case $line[1] in
        (create)
          _arguments \
            '(-h --help)'{-h,--help}'[show this message]' \
            '(-v --verbose)'{-v,--verbose}'[show more verbosity]' \
            '(-V --version)'{-V,--version}'[show version]' \
            '(-i --image)'{-i,--image}'[image to use for the container]: :' \
            '(-n --name)'{-n,--name}'[name for the distrobox]: :' \
            '(-H --home)'{-H,--home}'[select a custom HOME directory for the container]: :' \
            '*--volume[additional volumes to add to the container]: :_directories' \
            '(-a --additional-flags)'{-a,--additional-flags}'[additional flags to pass to the container manager command]: :' \
            '(-I --init)'{-I,--init}'[use init system (like systemd) inside the container]: :' \
            '(-d --dry-run)'{-d,--dry-run}'[only print the container manager command generated]' \
            && ret=0 ;;

        (enter)
          _arguments -S \
            '(-h --help)'{-h,--help}'[show this message]' \
            '(-v --verbose)'{-v,--verbose}'[show more verbosity]' \
            '(-V --version)'{-V,--version}'[show version]' \
            '(-n --name)'{-n,--name}'[name for the distrobox]: :' \
            '(-T --no-tty)'{-T,--no-tty}'[do not instantiate a tty]' \
            '(-a --additional-flags)'{-a,--additional-flags}'[additional flags to pass to the container manager command]: :' \
            '(-d --dry-run)'{-d,--dry-run}'[only print the container manager command generated]' \
            '(-e --)'{-e,--}'[end arguments execute the rest as command to execute at login]:*:' \
            && ret=0 ;;

        (export)
          _arguments -S \
            '(-h --help)'{-h,--help}'[show this message]' \
            '(-v --verbose)'{-v,--verbose}'[show more verbosity]' \
            '(-V --version)'{-V,--version}'[show version]' \
            '(-a --app)'{-a,--app}'[name of the application to export]: :' \
            '(-b --bin)'{-b,--bin}'[absolute path of the binary to export]: :' \
            '(-s --service)'{-s,--service}'[name of the service to export]: :' \
            '(-d --delete)'{-d,--delete}'[delete exported application or service]: :' \
            '(-el --export-label)'{-el,--export-label}'[label to add to exported application name]: :' \
            '(-ep --export-path)'{-ep,--export-path}'[path where to export the binary]: :' \
            '(-ef --extra-flags)'{-ef,--export-flags}'[extra flags to add to the command]: :' \
            '(-S --sudo)'{-S,--sudo}'[specify if the exported item should be run as sudo]' \
            && ret=0 ;;

        (list)
          _arguments -S \
            '(-h --help)'{-h,--help}'[show this message]' \
            '(-v --verbose)'{-v,--verbose}'[show more verbosity]' \
            '(-V --version)'{-V,--version}'[show version]' \
            && ret=0 ;;

        (rm)
          _arguments -S \
            '(-h --help)'{-h,--help}'[show this message]' \
            '(-v --verbose)'{-v,--verbose}'[show more verbosity]' \
            '(-V --version)'{-V,--version}'[show version]' \
            '(-n --name)'{-n,--name}'[name for the distrobox]: :' \
            '(-f --force)'{-f,--force}'[force deletion]' \
            && ret=0 ;;

        (stop)
          _arguments -S \
            '(-h --help)'{-h,--help}'[show this message]' \
            '(-v --verbose)'{-v,--verbose}'[show more verbosity]' \
            '(-V --version)'{-V,--version}'[show version]' \
            '(-n --name)'{-n,--name}'[name for the distrobox]: :' \
            '(-Y --yes)'{-Y,--yes}'[non-interactive, stop without asking]' \
            && ret=0 ;;
      esac ;;
  esac

  return $ret
}

_distrobox "$@"