The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#compdef efa

typeset -a arguments
typeset -A argument_pairs argument_postfix
typeset arg

argument_pairs=(
	time        t+
	arrive      a+
	date        d+
	bike        b
	exclude     e+
	max-change  m+
	prefer      P+
	proximity   p
	include     i+
	walk-speed  w+
	ignore-info I+
	version     v
)

argument_postfix=(
	time        '[Journey start time]:timestamp'
	arrive      '[Journey end time]:timestamp'
	date        '[Journey date]:date'
	bike        '[Prefer connections where you can take a bike with you]'
	exclude     '[Exclude transport types]:transport type:_efa_transports'
	max-change  '[Maximum interchanges]:maximum interchange number'
	prefer      '[Prefer connections]:connection type:(speed nowait nowalk)'
	proximity   '[Take close stops into account]'
	include     '[Include extra connection types]:connection type:(local ic ice)'
	walk-speed  '[Walk speed]:walk speed:(normal fast slow)'
	ignore-info '[Ignore additional information]:regex'
	verison     '[Print version information]'
)

arguments=(
	'--'{from,to,via}':city: :stop: '
	'--'{from,to,via}'-type:type:(stop address poi)'
	'(--depart --arrive)--time:time'
	'(--depart --time)--arrive:time'
	'(--arrive --time)--depart:time'
	'*--post:POST key=value'
)

for arg in ${(k)argument_pairs}; {
	arguments+='(--'${arg}')-'${argument_pairs[$arg]}${argument_postfix[$arg]}
	arguments+='(-'${${argument_pairs[$arg]}[1]}')--'${arg}${argument_postfix[$arg]}
}

function _efa_transports {
	typeset -a keys used_prefixes
	typeset prefix=''
	keys=(zug s-bahn u-bahn stadtbahn tram stadtbus regionalbus schnellbus seilbahn schiff ast sonstige)

	if [[ -prefix *, ]] {
		prefix=${words[$CURRENT]%,*},
		used_prefixes=(${(s:,:)prefix})
	}
	_wanted expression expl 'sort expression' \
	compadd -F used_prefixes -qS , -P "$prefix" $keys
}
_arguments -s $arguments