#autoload

local opt OPTARG matches end
local term=$'\0'

while getopts "t:" opt; do
  case $opt in
    (t)
    term=$OPTARG
    ;;

    (*)
    return 1
    ;;
  esac
done
shift $(( OPTIND - 1 ))

local tag=$1
local desc=$2
shift 2

if (( $# )); then
  reply=(\()
else
  # ### Is this likely to happen in callers?  Should we warn?
  reply=()
  return
fi

integer i
local -a wds

if [[ $term = $'\0' ]]; then
  matches=":${tag}:${desc}:(( "
  end="))"
else
  matches=":${tag}:${desc}:_values -s ${(q)term} ${(q)desc}"
fi

for (( i = 1; i <= $#; i++ )); do
  wds=(${(s.:.)argv[i]})
  reply+=(/${wds[1]//\**/"[^$term]#"}"$term"/)
  if [[ $term = $'\0' ]]; then
    matches+="${wds[1]//\*}${wds[2]:+\\:${wds[2]//(#m)[: \(\)]/\\$MATCH}} "
  else
    matches+=" ${(q)${${wds[1]//\*}//(#m)[:\[\]]/\\$MATCH}}\\[${(q)${wds[2]//(#m)[:\[\]]/\\$MATCH}}\\]"
  fi
  eval "reply+=($wds[3])"
  reply+=(\|)
done
reply+=( /'[]'/ "${matches}${end}" \) )
