#compdef systat

local -a screens opts
local pre
case $OSTYPE in
  freebsd*)
    pre=-
    screens=(
      'pigs:processes consuming the most CPU time'
      'sctp:SCTP statistics'
      icmp{6,}':ICMP statistics'
      ip{6,}':IP and UDP statistics'
      'tcp:TCP statistics'
      'iostat:processor and disk statistics'
      'swap:swap space statistics'
      'vmstat:virtual memory statistics'
      'netstat:network connection statistics'
      'ifstat:network traffic statistics'
      'zarc:display arc cache usage'
    )
  ;;
  openbsd*)
    screens=(
      'buckets:kernel malloc(9) bucket statistics'
      'cpu:per CPU, usage statistics'
      'ifstat:interface statistics'
      'iostat:disk throughput statistics'
      'malloc:malloc(9) type statistics'
      'mbufs:mbuf usage statistics'
      'netstat:network connection statistics'
      'nfsclient:NFS client statistics'
      'nfsserver:NFS server statistics'
      'pf:pf(4) filter statistics'
      'pigs:processes consuming the most CPU time'
      'pool:pool(9) statistics'
      'queues:pf(4) queue statistics'
      'rules:pf(4) rule statistics'
      'sensors:display hardware sensors values'
      'states:pf(4) states statistics'
      'swap:swap space usage'
      'vmstat:virtual memory statistics'
    )
    opts=(
      '-a[display all lines]'
      '-B[raw, non-interactive mode (two screen updates)]'
      '-b[raw, non-interactive mode (one screen update)]'
      '-d[exit after `count'\'' updates]:count'
      '-h[human readable output]'
      '-i[interactive mode]'
      '-N[resolve network addresses to names]'
      '-n[do not resolve network addresses to names]'
      '-s[screen refresh interval]:refresh interval (seconds)'
      '-w[maximum width of output in raw mode]:width'
    )
  ;;
  netbsd*)
    screens=(
      'all:cycle through all displays'
      'bufcache:filesystem buffer statistics'
      'df:disk usage statistics'
      'inet.icmp:ICMP statistics'
      'inet.ip:IPv4 and UDP statistics'
      'inet.tcp:TCP statistics'
      'inet.tcpsyn:TCP ``syncache'\'\'' statistics'
      'inet6.ip6:IPv6 statistics'
      'iostat:disk throughput statistics'
      'mbufs:mbuf usage statistics'
      'netstat:network connection statistics'
      'pigs:processes consuming the most CPU time'
      'ps:``ps -aux'\'\'' in a loop'
      'swap:swap space usage'
      'syscall:per system call statistics'
      'vmstat:virtual memory statistics'
    )
    opts=(
      '-M[alternative source to extract values from]:core:_files'
      '-N[alternative source to extract the name list from]:system:_files'
      '(-t -w)-b[show the chosen display once and exit]'
      "-n[don't resolve IP addresses]"
      '(-b)-w[refresh interval]:refresh interval'
      "(-b)-t[specify amount of refreshes for each screen in 'all' display mode]:turns"
      '-z[display 0 instead of space when there is no data]'
    )
esac

if (( $#screens )); then
  _arguments -M 'r:|.=* r:|=*' : $opts \
    '1:systat(1) display:(( ${pre}$^screens ))' \
    '2:refresh interval'
  return
fi

_default
