#compdef dig

local curcontext="$curcontext" state line expl
local -a alts args
[[ -prefix + ]] && args=(
  '*+'{no,}'tcp[use TCP instead of UDP for queries]'
  '*+'{no,}'ignore[ignore truncation in UDP responses]'
  '*+domain=-[set search list to single domain]:domain:_hosts'
  '!*+dscp=-:code point (0..63)'
  '*+'{no,}'search[use search list defined in resolv.conf]'
  '!*+'{no,}defname
  '*+'{no,}'showsearch[show intermediate results in domain search]'
  '*+split[split hex/base64 fields into chunks]:width (characters) [56]'
  '*+'{no,}'aaonly[set aa flag in the query]'
  '*+'{no,}'additional[print additional section of a reply]'
  '*+'{no,}'adflag[set the AD (authentic data) bit in the query]'
  '*+'{no,}'badcookie[retry BADCOOKIE responses]'
  '*+'{no,}'cdflag[set the CD (checking disabled) bit in the query]'
  '*+'{no,}'class[display the CLASS whening printing the record]'
  '*+'{no,}'coflag[set compact denial of existence ok flag in query]'
  '*+'{no,}'cookie[add a COOKIE option to the request]'
  '*+'{no,}'crypto[display cryptographic fields in DNSSEC records]'
  '*+'{no,}'dns64prefix[get the DNS64 prefixes from ipv4only.arpa]'
  '*+edns=-[specify EDNS version for query]:version (0-255) [0]'
  '*+noedns[clear EDNS version to be sent]'
  '*+ednsflags=-[set undefined EDNS flags bits]:flags'
  '*+'{no,}'ednsnegotiation[set EDNS version negotiation]'
  '*+ednsopt=-[specify EDNS option]:code point'
  '*+noednsopt[clear EDNS options to be sent]'
  '*+'{no,}'expandaaaa[expand AAAA records]'
  '*+'{no,}'expire[send an EDNS Expire option]'
  '*+'{no,}'header-only[send query without a question section]'
  '*+'{no,}'https=-[DNS-over-HTTPS POST mode]::endpoint [/dns-query]'
  '!*+'{no,}'https-post=-::endpoint [/dns-query]'
  '*+'{no,}'https-get=-[DNS-over-HTTPS GET mode]::endpoint [/dns-query]'
  '*+'{no,}'http-plain=-[DNS-over-HTTP POST mode]::endpoint [/dns-query]'
  '*+'{no,}'http-plain-get=-[DNS-over-HTTP GET mode]::endpoint [/dns-query]'
  '*+'{no,}'idn[convert international domain names]'
  '*+'{no,}'keepalive[request EDNS TCP keepalive]'
  '*+'{no,}'keepopen[keep TCP socket open between queries]'
  '*+'{no,}'recurse[set the RD (recursion desired) bit in the query]'
  '*+'{no,}'nssearch[search all authoritative nameservers]'
  '*+opcode=-[set DNS message opcode of the request]:opcode [QUERY]:(QUERY IQUERY STATUS NOTIFY UPDATE)'
  '*+noopcode[clear DNS message opcode]'
  '*+'{no,}'trace[trace delegation down from root]'
  '*+'{no,}'cmd[print initial comment in output]'
  '*+'{no,}'short[print terse output]'
  '*+'{no,}'showbadcookie[show BADCOOKIE message]'
  '*+'{no,}'showbadvers[show BADVERS message]'
  '*+'{no,}'identify[print IP and port of responder]'
  '*+'{no,}'comments[print comment lines in output]'
  '*+'{no,}'stats[print statistics]'
  '*+padding[set padding block size]:size [0]'
  '*+'{no,}'proxy=-[add PROXYv2 headers to queries]:src_addr[#src_port]-dst_addr[#dst_port]'
  '*+'{no,}'proxy-plain=-[add PROXYv2 headers to queries ahead of any encryption]:src_addr[#src_port]-dst_addr[#dst_port]'
  '*+qid=-[specify query ID]:query ID'
  '*+'{no,}'qr[print query as it was sent]'
  '*+'{no,}'question[print question section of a query]'
  '*+'{no,}'raflag[set RA flag in the query]'
  '*+'{no,}'answer[print answer section of a reply]'
  '*+'{no,}'authority[print authority section of a reply]'
  '*+'{no,}'all[set all print/display flags]'
  '*+'{no,}'subnet[send EDNS client subnet option]:addr/prefix-length'
  '*+'{no,}'tcflag[set TC flag in the query]'
  '*+timeout=-[set query timeout]:timeout (seconds) [5]'
  '*+'{no,}'tls[DNS-over-TLS mode]'
  '*+'{no,}"tls-ca=-[enable remote server's TLS certificate validation]:file:_files"
  '*+'{no,}"tls-hostname=-[explicitly set the expected TLS hostname]:hostname"
  '*+'{no,}'tls-certfile=-[load client TLS certificate chain from file]:file:_files'
  '*+'{no,}'tls-keyfile=-[load client TLS private key from file]:file:_files'
  '*+tries=-[specify number of UDP query attempts]:tries'
  '*+retry=-[specify number of UDP query retries]:retries'
  '*+'{no,}'rrcomments[set display of per-record comments]'
  '*+ndots=-[specify number of dots to be considered absolute]:dots'
  '*+bufsize=-[specify UDP buffer size]:size (bytes)'
  '*+'{no,}'multiline[verbose multi-line output]'
  '*+'{no,}'onesoa[AXFR prints only one soa record]'
  '*+'{no,}"fail[don't try next server on SERVFAIL]"
  '*+'{no,}'besteffort[try to parse even malformed messages]'
  '*+'{no,}'dnssec[request DNSSEC records]'
  '*+'{no,}'nsid[include EDNS name server ID request in query]'
  '*+'{no,}'ttlid[display the TTL whening printing the record]'
  '*+'{no,}'ttlunits[display the TTL in human-readable units]'
  '*+'{no,}'unknownformat[print RDATA in RFC 3597 "unknown" format]'
  '*+'{no,}'yaml[present the results as YAML]'
  '*+'{no,}'zflag[set Z flag in query]'
)
_arguments -s -C $args \
  '(- *)-h[display help information]' \
  '(- *)-v[display version information]' \
  '*-c+[specify class]:class:compadd -M "m\:{a-z}={A-Z}" - IN CS CH HS' \
  '*-b+[specify source IP]:IP' \
  '*-f+[batch mode, read arguments from file]:file:_files' \
  '*-m[enable memory usage debugging]' \
  '*-p+[specify port number]:port:_ports' \
  '*-4[use IPv4 only]' \
  '*-6[use IPv6 only]' \
  '*-t+[specify type]:type:_dns_types' \
  '*-q+[specify host name to query]:host:_hosts' \
  "-r[don't read ~/.digrc]" \
  '*-x+[reverse lookup]:IP address' \
  '*-k+[specify TSIG key file]:file:_files' \
  '*-y+[specify TSIG key]:hmac\:name\:key' \
  '*: :->args' && ret=0

if [[ -n $state ]]; then
  if compset -P @; then
    _wanted hosts expl 'DNS server' _hosts && ret=0;
  else
    case $#line in
      <3->) alts+=( 'classes:query class:compadd -M "m:{a-z}={A-Z}" - IN CS CH HS' ) ;&
      2) alts+=( 'types:query type:_dns_types' ) ;;
    esac
    _alternative 'hosts:host:_hosts' $alts && ret=0
  fi
fi

return ret
