#compdef mktap

# if the available subcmds aren't cached in
# this global var then we create it
if [[ -z $_mktap_subcmds ]]; then
  _mktap_subcmds=(
    "conch:A Conch SSH service"
    "dns:A Domain Name Server"
    "ftp:An FTP server"
    "inetd:An inetd(8) replacement"
    "mail:An email service"
    "manhole:An interactive remote debugger service"
    "news:News Server"
    "portforward:A simple port-forwarder"
    "socks:A SOCKSv4 proxy service"
    "telnet:A simple, telnet-based remote debugging service"
    "toc:An AIM TOC service"
    "web:A general-purpose web server"
    "words:A chat service"
    )
  local third_party_modules available_modules py_code
  typeset -A third_party_modules
  third_party_modules=(
    "cvstoys.fresher"       "cvsweb:CVS commit news on RSS and HTML"
    "cvstoys.clients.words" "cvswords:CVS commit notification over chat services"
    "cvstoys.clients.web"   "freshcvs:CVS commit tracking and notification"
    )
  py_code="
moduleNames = '${(k)third_party_modules}'
import sys, os
paths = filter(os.path.isdir, sys.path)
exists = os.path.exists
def isModuleOnDisk(modName):
    modName = modName.replace('.', '/')
    for p in paths:
        for ext in ('.py', '.pyc', '.pyo'):
            if exists('%s/%s%s' % (p, modName, ext)):
                return True
    return False
print ' '.join(filter(isModuleOnDisk, moduleNames.split()))
"
  available_modules=($(echo $py_code | python))
        
  for module in $available_modules; do
    # append the spec's for the 3rd-party modules we found
    _mktap_subcmds[${#_mktap_subcmds}+1]=$third_party_modules[$module]
  done
fi

_arguments -C -S \
  '(--encrypted)-e[Encrypt file before writing]' \
  '(-e)--encrypted[Encrypt file before writing]' \
  '(--debug)-d[Show debug information for plugin loading]' \
  '(-d)--debug[Show debug information for plugin loading]' \
  '(--help)-h[Display verbose mktap help]' \
  '(-h)--help[Display verbose mktap help]' \
  '(--uid)-u[The uid to run as (default 1000)]:uid to run as: ' \
  '(-u)--uid=[The uid to run as (default 1000)]:uid to run as: ' \
  '(--gid)-g[The gid to run as (default 1000)]:gid to run as: ' \
  '(-g)--gid=[The gid to run as (default 1000)]:gid to run as: ' \
  '(--append)-a[An existing .tap file to append the plugin to]:.tap file to append to:_files -g "*.tap"' \
  '(-a)--append=[An existing .tap file to append the plugin to]:.tap file to append to:_files -g "*.tap"' \
  '(--type)-t[The output format to use (default pickle)]:output format:(pickle xml source)' \
  '(-t)--type=[The output format to use (default pickle)]:output format:(pickle xml source)' \
  '(--appname)-n[The process name to use for this application]:process name: ' \
  '(-n)--appname=[The process name to use for this application]:process name: ' \
  '--version[Print version information and exit]' \
  '*::sub command:->subcmd' \
  && return 0

if (( CURRENT == 1 )); then
  _describe "tap to build" _mktap_subcmds && ret=0
fi
(( ret )) || return 0

service="$words[1]"

case $service in
  conch)
    _arguments \
      '(--interface)-i[Address of interface to bind to]:net interface address: ' \
      '(-i)--interface=[Address of interface to bind to]:net interface address: ' \
      '(--port)-p[Listen port (default 5822)]:port: ' \
      '(-p)--port=[Listen port (default 5822)]:port: ' \
      '(--data)-d[Directory to look for host keys in (default /etc)]:directory host keys are in:_directories' \
      '(-d)--data=[Directory to look for host keys in (default /etc)]:directory host keys are in:_directories' \
      '--moduli=[Directory to look for moduli in (if different from --data)]:moduli directory:_directories' \
      '--help[Display verbose command help]'
  ;;
  dns)
    _arguments \
      '(--cache)-c[Enable record caching]' \
      '(-c)--cache[Enable record caching]' \
      '(--recursive)-r[Perform recursive lookups]' \
      '(-r)--recursive[Perform recursive lookups]' \
      '(--iterative)-I[Perform lookups using the root servers]' \
      '(-I)--iterative[Perform lookups using the root servers]' \
      '(--verbose)-v[Increment verbosity level]' \
      '(-v)--verbose[Increment verbosity level]' \
      '(--interface)-i[Address of interface to bind to]:net interface address: ' \
      '(-i)--interface=[Address of interface to bind to]:net interface address: ' \
      '(--port)-p[Listen port]:port: ' \
      '(-p)--port=[Listen port]:port: ' \
      '--resolv-conf=[Override location of resolv.conf]:your resolv.conf-like file:_files' \
      '--help[Display verbose command help]'
      '--secondary=[Act as secondary for the specified domain]:domain: ' \
      '--pyzone=[Filename of a Python syntax zone definition]:.py zone file:_files -g "*.py"' \
      '--bindzone=[Filename of a BIND9 syntax zone definition]:bind zone file:_files'
  ;;
  ftp)
    _arguments \
      '(--port)-p[Listen port]:port: ' \
      '(-p)--port=[Listen port]:port: ' \
      '(--root)-r[Root of the ftp-site (default /usr/local/ftp)]:root directory of the ftp-site:_directories' \
      '(-r)--root=[Root of the ftp-site (default /usr/local/ftp)]:root directory of the ftp-site:_directories' \
      '--userAnonymous=[Name of the anonymous user (default anonymous)]:name of anonymous user: ' \
      '--help[Display verbose command help]'
  ;;
  inetd)
    _arguments \
      "(--nointernal)-i[Don't run internal services]" \
      "(-i)--nointernal[Don't run internal services]" \
      '(--rpc)-r[RPC procedure table file (default /etc/rpc)]:RPC procedure table file:_files' \
      '(-r)--rpc=[RPC procedure table file (default /etc/rpc)]:RPC procedure table file:_files' \
      '(--file)-f[Service configuration file (default /etc/inetd.conf)]:service .conf file:_files -g "*.conf"' \
      '(-f)--file=[Service configuration file (default /etc/inetd.conf)]:service .conf file:_files -g "*.conf"' \
      '--help[Display verbose command help]'
  ;;
  mail)
    _arguments \
      '(--esmtp)-E[Use RFC 1425/1869 SMTP extensions]' \
      '(-E)--esmtp[Use RFC 1425/1869 SMTP extensions]' \
      '--disable-anonymous[Disallow non-authenticated SMTP connections]' \
      '(--pop3)-p[POP3 server port. 0 to disable (default 8110)]:pop3 port: ' \
      '(-p)--pop3=[POP3 server port. 0 to disable (default 8110)]:pop3 port: ' \
      '(--pop3s)-S[POP3-over-SSL server port. 0 to disable (default 0)]:pop3s port: ' \
      '(-S)--pop3s=[POP3-over-SSL server port. 0 to disable (default 0)]:pop3s port: ' \
      '(--smtp)-s[SMTP server port. 0 to disable (default 8025)]:smtp port: ' \
      '(-s)--smtp=[SMTP server port. 0 to disable (default 8025)]:smtp port: ' \
      '(--certificate)-c[Certificate file for SSL]:cert file for ssl:_files' \
      '(-c)--certificate=[Certificate file for SSL]:cert file for ssl:_files' \
      '(--relay)-R[Queue directory for relaying (see --help)]:relay queue dir:_directories' \
      '(-R)--relay=[Queue directory for relaying (see --help)]:relay queue dir:_directories' \
      '(--hostname)-H[Hostname of this server]:hostname: ' \
      '(-H)--hostname=[Hostname of this server]:hostname: ' \
      '(--default)-D[Make the most recently specified domain the default domain]' \
      '(-D)--default[Make the most recently specified domain the default domain]' \
      '(--maildirdbmdomain)-d[Generate an SMTP/POP3 virtual domain which saves to "path"]:path to save to:_directories' \
      '(-d)--maildirdbmdomain=[Generate an SMTP/POP3 virtual domain which saves to "path"]:path to save to:_directories' \
      '(--user)-u[Add a user/password to the last specified domains]:user/password: ' \
      '(-u)--user=[Add a user/password to the last specified domains]:user/password: ' \
      '(--passwordfile)-P[File containing username:password login info for authenticated ESMTP connections]:username\:password file:_files'
      '(-P)--passwordfile=[File containing username:password login info for authenticated ESMTP connections]:username\:password file:_files'
      '--bounce-to-postmaster[Undelivered mails are sent to the postmaster]' \
      '(--aliases)-A[Specify an aliases(5) file to use for this domain]:aliases(5) file:_files' \
      '(-A)--aliases=[Specify an aliases(5) file to use for this domain]:aliases(5) file:_files'
      '--help[Display verbose command help]'
  ;;
  manhole)
    _arguments \
      '(--tracebacks)-T[Allow tracebacks to be sent over the network]' \
      '(-T)--tracebacks[Allow tracebacks to be sent over the network]' \
      '(--user)-u[Name of user to allow to log in (default admin)]:username: ' \
      '(-u)--user=[Name of user to allow to log in (default admin)]:username: ' \
      '(--port)-p[Port to listen on (default 8787)]:port: ' \
      '(-p)--port=[Port to listen on (default 8787)]:port: ' \
      '(--password)-w[Required (- will prompt or read a password from stdin)]:password: ' \
      '(-w)--password=[Required (- will prompt or read a password from stdin)]:password: ' \
      '--help[Display verbose command help]'
  ;;
  news)
    _arguments \
      '(--port)-p[Listen port (default 119)]:port: ' \
      '(-p)--port=[Listen port (default 119)]:port: ' \
      '(--interface)-i[Address of interface to bind to]:net interface address: ' \
      '(-i)--interface=[Address of interface to bind to]:net interface address: ' \
      '(--datadir)-d[Root data storage path (default news.db)]:data storage path:_files' \
      '(-d)--datadir=[Root data storage path (default news.db)]:data storage path:_files' \
      '(--mailhost)-m[Host of SMTP server to use (default localhost)]:hostname: ' \
      '(-m)--mailhost=[Host of SMTP server to use (default localhost)]:hostname: ' \
      '--group=[Name of a newsgroup to carry]:newsgroup: ' \
      '--server=[Address of a Usenet server to send to and receive from]:Usenet server: ' \
      '--moderator=[Email of the moderator for the most recently specified group]:email address: ' \
      '--subscription=[Newsgroup to list as a recommended subscription]:newsgroup to list as recommended: ' \
      '--help[Display verbose command help]'
  ;;
  portforward)
    _arguments \
      '(--port)-p[Port number (default 6666)]:port: ' \
      '(-p)--port=[Port number (default 6666)]:port: ' \
      '(--host)-h[Host (default localhost)]:host: ' \
      '(-h)--host=[Host (default localhost)]:host: ' \
      '(--dest_port)-d[Destination port (default 6665)]:destination port: ' \
      '(-d)--dest_port=[Destination port (default 6665)]:destination port: ' \
      '--help[Display verbose command help]'
  ;;
  socks)
    _arguments \
      '(--interface)-i[Address of interface to bind to]:net interface address: ' \
      '(-i)--interface=[Address of interface to bind to]:net interface address: ' \
      '(--port)-p[Listen port (default 1080)]:port: ' \
      '(-p)--port=[Listen port (default 1080)]:port: ' \
      '(--log)-l[File to log connection data to]:.log file:_files -g "*.log"' \
      '(-l)--log=[File to log connection data to]:.log file:_files -g "*.log"' \
      '--help[Display verbose command help]'
  ;;
  telnet)
    _arguments \
      '(--username)-u[Login username (default admin)]:username: ' \
      '(-u)--username=[Login username (default admin)]:username: ' \
      '(--password)-w[Password (default changeme)]:password: ' \
      '(-w)--password=[Password (default changeme)]:password: ' \
      '(--port)-p[Listen port (default 4040)]:port: ' \
      '(-p)--port=[Listen port (default 4040)]:port: ' \
      '--help[Display verbose command help]'
  ;;
  toc)
    _arguments \
      '(--port)-p[Listen port (default 5190)]:port: ' \
      '(-p)--port=[Listen port (default 5190)]:port: ' \
      '--help[Display verbose command help]'
  ;;
  web)
    _arguments \
      '--personal[Make a ResourcePublisher listening on ~/.twistd-web-pb]' \
      '(--notracebacks)-n[Display tracebacks in broken web pages (could be a security risk!)]' \
      '(-n)--notracebacks[Display tracebacks in broken web pages (could be a security risk!)]' \
      '(--port)-p[Listen port (HTTP) (default 8080)]:port: ' \
      '(-p)--port=[Listen port (HTTP) (default 8080)]:port: ' \
      '(--logfile)-l[Path to web CLF (Combined Log Format) log file]:CLF .log file:_files -g "*.log"' \
      '(-l)--logfile=[Path to web CLF (Combined Log Format) log file]:CLF .log file:_files -g "*.log"' \
      '--https=[Listen port (HTTPS)]:https port: ' \
      '(--certificate)-c[SSL certificate to use for HTTPS (default server.pem)]:.pem certificate for https:_files -g "*.pem"' \
      '(-c)--certificate=[SSL certificate to use for HTTPS (default server.pem)]:.pem certificate for https:_files -g "*.pem"' \
      '(--privkey)-k[SSL certificate to use for HTTPS (default server.pem) ]:.pem certificate for https:_files -g "*.pem"' \
      '(-k)--privkey=[SSL certificate to use for HTTPS (default server.pem) ]:.pem certificate for https:_files -g "*.pem"' \
      '(--index)-i[Add the name of a directory index file (default index, index.html)]:directory index file:_files' \
      '(-i)--index=[Add the name of a directory index file (default index, index.html)]:directory index file:_files' \
      '(--static)-s[Same as --path, this is deprecated and will be removed in a future release]:same as --path [deprecated]:_directories' \
      '(-s)--static=[Same as --path, this is deprecated and will be removed in a future release]:same as --path [deprecated]:_directories' \
      '--class=[Create a Resource subclass with a zero-argument constructor]:Resource subclass with a zero-argument constructor: ' \
      '--flashconduit=[Start a flashconduit on the specified port]' \
      '--ignore-ext=[Specify an extension to ignore. These will be processed in order]' \
      '(--user)-u[Makes a server with ~/public_html and ~/.twistd-web-pb support for users]' \
      '(-u)--user[Makes a server with ~/public_html and ~/.twistd-web-pb support for users]' \
      "--allow-ignore-ext[Specify whether or not a request for 'foo' should return 'foo.ext']" \
      '--path=[A specific file or a directory to be set as the root of the web server]' \
      "--processor=['ext=class' where 'class' is added as a Processor for files ending with 'ext']" \
      '--mime-type=[Specify the default mime-type for static files]' \
      '--resource-script=[An .rpy file to be used as the root resource of the webserver]' \
      '--help[Display verbose command help]'
  ;;
  words)
    _arguments \
      '(--irc)-i[Port to run the IRC server on (default 6667)]:irc server port: ' \
      '(-i)--irc=[Port to run the IRC server on (default 6667)]:irc server port: ' \
      '(--irchost)-h[Host to bind IRC server to (no default)]:host to bind irc server to: ' \
      '(-h)--irchost=[Host to bind IRC server to (no default)]:host to bind irc server to: ' \
      '(--wordshost)-b[Host to bind Words service to (no default)]:host to bind Words service to: ' \
      '(-b)--wordshost=[Host to bind Words service to (no default)]:host to bind Words service to: ' \
      '(--webhost)-s[Host to bind web interface to (no default)]:host to bind web interface to: ' \
      '(-s)--webhost=[Host to bind web interface to (no default)]:host to bind web interface to: ' \
      '(--port)-p[Port to run the Words service on (default 8787)]:Words service port: ' \
      '(-p)--port=[Port to run the Words service on (default 8787)]:Words service port: ' \
      '(--web)-w[Port to run the web interface on (default 8080)]:web server port: ' \
      '(-w)--web=[Port to run the web interface on (default 8080)]:web server port: ' \
      "--bot=[Bot-plugin to load in the format 'plugin:nickname'. plugin types are: botbot]:bot-plugin to load in the format 'plugin:nickname': " \
      '--user=[user/password combo to add to the authorizer and chat service immediately]:user/password to add to the authorizer and chat service: ' \
      '--help[Display verbose command help]'
  ;;

# BEGIN third-party completions here
  
  cvsweb)
    _arguments \
      '--chost=[(default localhost)]:host: ' \
      '--cport=[(default 7878)]:port: ' \
      '--cuser=[(default web)]:username: ' \
      '--cpass=[(default notifiee)]:password: ' \
      '--cservice=[(default cvstoys.notify)]:service: ' \
      '--webport=[(default 8241)]:port: ' \
      '(--title)-t[(default Recent CVS Activity)]:title: ' \
      '(-t)--title=[(default Recent CVS Activity)]:title: ' \
      '(--description)-d[(no default)]:descr: ' \
      '(-d)--description=[(no default)]:descr: ' \
      '(--link)-l[(default http://twistedmatrix.com/)]:link: ' \
      '(-l)--link=[(default http://twistedmatrix.com/)]:link: ' \
      '--help[Display verbose command help]'
  ;;
  cvswords)
    _arguments \
      '(--config)-f[Configuration file]:config file:_files]' \
      '(-f)--config=[Configuration file]:config file:_files]' \
      '(--cvs-host)-H[FreshCVS host (default localhost)]:host: ' \
      '(-H)--cvs-host=[FreshCVS host (default localhost)]:host: ' \
      '(--cvs-port)-P[FreshCVS PB port (default 7878)]:port: ' \
      '(-P)--cvs-port=[FreshCVS PB port (default 7878)]:port: ' \
      '(--cvs-user)-U[FreshCVS username (default words)]:username: ' \
      '(-U)--cvs-user=[FreshCVS username (default words)]:username: ' \
      '(--cvs-pass)-W[FreshCVS password (default notifiee)]:password: ' \
      '(-W)--cvs-pass=[FreshCVS password (default notifiee)]:password: ' \
      '(--cvs-service)-S[FreshCVS service (default cvstoys.notify)]:service: ' \
      '(-S)--cvs-service=[FreshCVS service (default cvstoys.notify)]:service: ' \
      '--help[Display verbose command help]'
  ;;
  freshcvs)
    _arguments \
      '--manhole-port=[manhole port (default 8789)]:port: ' \
      '--pipe=[Unix socket to listen on]:unix socket to listen on: ' \
      '--manhole=[Password to the manhole (- will read from stdin or prompt)]:password: ' \
      '(--root)-r[Directory where the configuration file lives]:directory of config file:_directories' \
      '(-r)--root=[Directory where the configuration file lives]:directory of config file:_directories' \
      '--help[Display verbose command help]'
  ;;
  *) _message "don't know how to complete $service";;
esac

