#compdef tin rtin

local newshosts expl state line curcontext="$curcontext" ret=1

_arguments -C -s \
  '-a[toggle color flag]' \
  '-A[force authentication on connect]' \
  '-c[mark all news as read in subscribed groups]' \
  "-d[don't show newsgroup descriptions]" \
  '-f[specify newsrc file to use]:newsrc file:_files' \
  '-G[specify limit to articles/group to get]:number of articles/group to get' \
  '-g[specify NNTP server]:NNTP server:->newshosts' \
  '-h[display help on tin usage]' \
  '-H[display help information]' \
  '-I[specify news index file directory]:news index file directory:_files -/' \
  '-l[get number of articles per group from the active file]' \
  '-m[specify mailbox directory]:mailbox directory:_files -/' \
  '-M[mail new news to specified user]:user:_users' \
  '-n[only read subscribed groups from server]' \
  '-N[mail new news to yourself]' \
  '-o[post all postponed articles and exit]' \
  '-p[specify port to connect to NNTP server]:NNTP port:_ports' \
  "-q[don't check for new newsgroups]" \
  '-Q[quick start. Same as -nqd]' \
  ${${service:#r*}:+-r\[read news remotely over NNTP\]} \
  '-R[read news saved with -S]' \
  '-s[specify saved news directory]:saved news directory:_files -/' \
  '-S[save new news for later reading]' \
  '-u[update index files]' \
  '-U[update index files in the background while reading news]' \
  '-v[verbose output in batch mode]' \
  '-V[display version information]' \
  '-w[post an article and exit]' \
  "-X[don't save any files on quit]" \
  '-z[start if any unread news]' \
  '-Z[return status to indicate if any unread news]' \
  '::newsgroup:_newsgroups' && return 0

if [[ "$state" = newshosts ]]; then
  newshosts=( ${${(f)"$(<~/.tin/newsrctable)"}%%\#*} ) 2>/dev/null
  _tags hosts nicknames
  while _tags; do
    _requested hosts expl 'NNTP server hostname' \
        compadd ${=newshosts#*[[:blank:]]##[^[:blank:]]*[[:blank:]]} && ret=0
    _requested nicknames expl 'NNTP server nickname' \
        compadd -M 'r:|.=* r:|=*' ${newshosts%%[[:blank:]]*} && ret=0
    (( ret )) || return 0
  done
fi

return 1

