#compdef myconfig

_myconfig() {
  local context state line
  typeset -A opt_args

  _arguments -C \
    '(-y --yes)'{-y,--yes}'[non-interactive mode]' \
    '(-n --dry-run)'{-n,--dry-run}'[dry run mode]' \
    '(-v --verbose)'{-v,--verbose}'[verbose logging]' \
    '(--quiet)--quiet[quiet mode]' \
    '(--no-mas)--no-mas[skip mas operations]' \
    '(--preview)--preview[preview mode, show what will be processed]' \
    '(--version)--version[show version information]' \
    '(-c --config)'{-c,--config}'[path to config file or directory]:config file:_files' \
    '1:command:(export scan restore doctor defaults diff pack unpack profile help)' \
    '*::arg:->args' && return 0

  case $state in
    args)
      case $words[1] in
        export)
          _arguments \
            '1:output directory:_files -/' \
            '(--compress)--compress[create compressed backup archive (.tar.gz)]'
          ;;
        scan)
          _arguments \
            '(--apps)--apps[scan Applications folder and known configs]'
          ;;
        restore)
          _arguments \
            '1:source directory or archive:_files'
          ;;
        doctor)
          # No additional arguments
          ;;
        defaults)
          _arguments \
            '1:subcommand:(export-all import)' \
            '*::arg:->defaults_args'
          case $state in
            defaults_args)
              case $words[1] in
                import)
                  _arguments '1:directory:_files -/'
                  ;;
              esac
              ;;
          esac
          ;;
        diff)
          _arguments \
            '1:first backup directory:_files -/' \
            '2:second backup directory:_files -/'
          ;;
        pack)
          _arguments \
            '1:source directory:_files -/' \
            '2:output file:_files' \
            '(--gpg)--gpg[use gpg symmetric encryption]'
          ;;
        unpack)
          _arguments \
            '1:archive file:_files -g "*.tar.gz *.tgz"' \
            '2:output directory:_files -/'
          ;;
        profile)
          _arguments \
            '1:subcommand:(list use save)' \
            '*::arg:->profile_args'
          case $state in
            profile_args)
              case $words[1] in
                use|save)
                  _arguments '1:profile name:'
                  ;;
              esac
              ;;
          esac
          ;;
      esac
      ;;
  esac
}

_myconfig "$@"
