#compdef lha

if (( CURRENT == 2 )); then
    compset -P -

    local lhacmds
    lhacmds=(
	'(  x l v u d m c p t)a[Add \(Or replace\) to archive]'
	'(a   l v u d m c p t)x[EXtract from archive]'
	'(a x   v u d m c p t)l[List]'
	'(a x l   u d m c p t)v[Verbose List]'
	'(a x l v   d m c p t)u[Update newer files to archive]'
	'(a x l v u   m c p t)d[Delete from archive]'
	'(a x l v u d   c p t)m[Move to archive]'
	'(a x l v u d m   p t)c[re-Construct new archive]'
	'(a x l v u d m c   t)p[Print to STDOUT from archive]'
	'(a x l v u d m c p  )t[Test file CRC in archive]'
    )

    if [ "${words[2]#-}" != "" ]; then
	lhacmds=($lhacmds
	    'v[verbose]'
	    'q[quiet]'
	    'n[not execute]'
	    'f[force\(over write at extract\)]'
	    't[FILES are TEXT file]'
	    'e[TEXT code convert from/to EUC]'
	    'g[Generic format \(for compatibility\)]'
	)
	case ${words[2]#-} in
	    a*|u*)
		lhacmds=($lhacmds
		    'd[delete FILES after]'
		    'z[files not compress]'
		    '(  1 2)0[header level 0]'
		    '(0   2)1[header level 1]'
		    '(0 1  )2[header level 2]'
		)
		;;
	    c*)
		lhacmds=($lhacmds 'd[delete FILES after]')
		;;
	    x*)
		lhacmds=($lhacmds 'i[ignore directory path]')
		;;
	esac
    fi

    _values -s '' 'lha command' \
	$lhacmds \
	&& return 0
elif (( CURRENT == 3 )); then
    _arguments -C \
	'*:LHA file:_files -g \*.lzh' && return 0
else
    case ${words[2]#-} in
	l*|x*|d*)
	    if [ -f "$words[3]" ]; then
		_lzh_cache_list=`$words[1] lq $words[3] | awk '{print $8}'`
		_lzh_cache_list=("${(@f)${_lzh_cache_list}}")
		
		_wanted files expl 'file from archive' _multi_parts / _lzh_cache_list

		return 0
	    else
		_message -r "Archive file is not found : ${words[3]}"
		return 1
	    fi
		
	    ;;
	*)
	    _arguments -C \
		'*:file:_files' && return 0
    esac
fi

return 0
