#compdef osmium
#
# ZSH completion for Osmium tool.
#
# To test this file:
# 1) Comment out last line
# 2) Call: . ./_osmium
# 3) Call: compdef _osmium osmium
#
# To read more about what is happening here:
#  zshcompsys(1)
#  http://bewatermyfriend.org/p/2012/003/
#  http://zsh.sourceforge.net/Guide/zshguide06.html
#

osmium_file_glob="'*.(osm|osh|osc|o5m|o5c|pbf|osm.pbf) *.(osm|osh|osc|o5m|o5c).(bz2|gz)'"
polygon_file_glob="'*.json *.geojson *.poly *.(osm|osh|osc|o5m|o5c|pbf|osm.pbf) *.(osm|osh|osc|o5m|o5c).(bz2|gz)'"

_osmium() {
    local -a osmium_commands
    osmium_commands=(add-locations-to-ways apply-changes cat diff changeset-filter check-refs derive-changes export extract fileinfo getid help merge merge-changes renumber show sort tags-filter time-filter)
    if (( CURRENT > 2 )); then
        # Remember the subcommand name
        local cmd=${words[2]}
        # Set the context for the subcommand.
        curcontext="${curcontext%:*:*}:osmium-$cmd"
        # Narrow the range of words we are looking at to exclude `osmium'
        (( CURRENT-- ))
        shift words
        # Run the completion for the subcommand
        _osmium-$cmd
    else
        _describe -t osmium-commands 'osmium subcommand' osmium_commands
    fi
}

_osmium-common-options() {
    echo '(--help)-h[show usage help]'
    echo '(-h)--help[show usage help]'
    echo '(--verbose)-v[set verbose mode]'
    echo '(-v)--verbose[set verbose mode]'
}

_osmium-single-input-options() {
    echo '(--input-format)-F[format of input OSM file]:OSM file format:_osmium_input_file_formats'
    echo '(-F)--input-format[format of input OSM file]:OSM file format:_osmium_input_file_formats'
    echo "1:input OSM files:_files -g ${osmium_file_glob}"
}

_osmium-multiple-inputs-options() {
    echo '(--input-format)-F[format of input OSM files]:OSM file format:_osmium_input_file_formats'
    echo '(-F)--input-format[format of input OSM files]:OSM file format:_osmium_input_file_formats'
    echo "*:input OSM files:_files -g ${osmium_file_glob}"
}

_osmium-output-options() {
    echo '--fsync[call fsync after writing output file(s)]'
    echo '--generator[generator setting for output file header]:'
    echo "*--output-header[add option to output header]:"
    echo "(--output)-o[output file name]:output OSM file:_files -g ${osmium_file_glob}"
    echo "(-o)--output[output file name]:output OSM file:_files -g ${osmium_file_glob}"
    echo '(--overwrite)-O[allow overwriting of existing output file]'
    echo '(-O)--overwrite[allow overwriting of existing output file]'
}

_osmium-output-format-options() {
    echo '(--output-format)-f[format of output OSM file]:OSM file format:_osmium_output_file_formats'
    echo '(-f)--output-format[format of output OSM file]:OSM file format:_osmium_output_file_formats'
}

_osmium-diff-output-format-options() {
    echo '(--output-format)-f[format of output file]:OSM file format:_osmium_diff_file_formats'
    echo '(-f)--output-format[format of output file]:OSM file format:_osmium_diff_file_formats'
}

_osmium-add-locations-to-ways() {
    _arguments : \
        ${(f)"$(_osmium-common-options)"} \
        ${(f)"$(_osmium-multiple-inputs-options)"} \
        ${(f)"$(_osmium-output-format-options)"} \
        ${(f)"$(_osmium-output-options)"} \
        '(--index-type -I --show-index-types)-i[set index type]:index types:_osmium_index_types' \
        '(-i -I --show-index-types)--index-type[set index type]:index types:_osmium_index_types' \
        '(--show-index-types -i --index-type -n --keep-untagged-nodes)-I[show available index types]' \
        '(-I -i --index-type -n --keep-untagged-nodes)--show-index-types[show available index types]' \
        '(--keep-untagged-nodes -I --show-index-types)-n[keep untagged nodes in output]' \
        '(-n -I --show-index-types)--keep-untagged-nodes[keep untagged nodes in output]' \
        '(--progress)--no-progress[disable progress bar]' \
        '(--no-progress)--progress[enable progress bar]'
}

_osmium-apply-changes() {
    _arguments : \
        ${(f)"$(_osmium-common-options)"} \
        ${(f)"$(_osmium-multiple-inputs-options)"} \
        ${(f)"$(_osmium-output-format-options)"} \
        ${(f)"$(_osmium-output-options)"} \
        '--change-file-format[Format of the change file(s)]' \
        '--locations-on-ways[update OSM file with locations on ways]' \
        '(--with-history)-H[update OSM history file]' \
        '(-H)--with-history[update OSM history file]'
}

_osmium-cat() {
    _arguments : \
        ${(f)"$(_osmium-common-options)"} \
        ${(f)"$(_osmium-multiple-inputs-options)"} \
        ${(f)"$(_osmium-output-format-options)"} \
        ${(f)"$(_osmium-output-options)"} \
        '*-t[read only objects of given output types]:OSM entity type:_osmium_entity_type' \
        '*--object-type[read only objects of given output types]:OSM entity type:_osmium_entity_type' \
        '(--progress)--no-progress[disable progress bar]' \
        '(--no-progress)--progress[enable progress bar]'
}

_osmium-changeset-filter() {
    _arguments : \
        ${(f)"$(_osmium-common-options)"} \
        ${(f)"$(_osmium-single-input-options)"} \
        ${(f)"$(_osmium-output-format-options)"} \
        ${(f)"$(_osmium-output-options)"} \
        '(--with-discussions)-d[changesets with discussions]' \
        '(-d)--with-discussions[changesets with discussions]' \
        '(--without-discussions)-D[changesets without discussions]' \
        '(-D)--without-discussions[changesets without discussions]' \
        '(--with-changes)-c[changesets with changes]' \
        '(-c)--with-changes[changesets with changes]' \
        '(--without-changes)-C[changesets without changes]' \
        '(-C)--without-changes[changesets without changes]' \
        '--open[open changesets]' \
        '--closed[closed changesets]' \
        '(--user)-u[changesets by user]' \
        '(-u)--user[changesets by user]' \
        '(--uid)-U[changesets by user id]' \
        '(-U)--uid[changesets by user id]' \
        '-a[changesets closed after]:timestamp:' \
        '--after[changesets closed after]:timestamp:' \
        '-b[changesets opened before]:timestamp:' \
        '--before[changesets opened before]:timestamp:' \
        '(--bbox)-B[bounding box]:changesets in bounding box (format\: LEFT,BOTTOM,RIGHT,TOP):' \
        '(-B)--bbox[bounding box]:changesets in bounding box (format\: LEFT,BOTTOM,RIGHT,TOP):' \
        '(--progress)--no-progress[disable progress bar]' \
        '(--no-progress)--progress[enable progress bar]'
}

_osmium-check-refs() {
    _arguments : \
        ${(f)"$(_osmium-common-options)"} \
        ${(f)"$(_osmium-single-input-options)"} \
        '(--show-ids)-i[show ids of missing objects]' \
        '(-i)--show-ids[show ids of missing objects]' \
        '(--check-relations)-r[also check referential integrity of relations]' \
        '(-r)--check-relations[also check referential integrity of relations]' \
        '(--progress)--no-progress[disable progress bar]' \
        '(--no-progress)--progress[enable progress bar]'
}

_osmium-derive-changes() {
    _arguments : \
        ${(f)"$(_osmium-common-options)"} \
        ${(f)"$(_osmium-multiple-inputs-options)"} \
        ${(f)"$(_osmium-output-format-options)"} \
        ${(f)"$(_osmium-output-options)"} \
        '--increment-version[increment version of deleted objects]' \
        '--keep-details[keep details of deleted objects]' \
        '--update-timestamp[update timestamp of deleted objects]'
}

_osmium-diff() {
    _arguments : \
        ${(f)"$(_osmium-common-options)"} \
        ${(f)"$(_osmium-multiple-inputs-options)"} \
        ${(f)"$(_osmium-diff-output-format-options)"} \
        ${(f)"$(_osmium-output-options)"} \
        '(--quiet)-q[report only when files differ]' \
        '(-q)--quiet[report only when files differ]' \
        '(--suppress-common)-c[suppress common objects]' \
        '(-c)--suppress-common[suppress common objects]' \
        '(--summary)-s[Show summary on STDERR]' \
        '(-s)--summary[Show summary on STDERR]' \
        '*-t[read only objects of given output types]:OSM entity type:_osmium_object_type' \
        '*--object-type[read only objects of given output types]:OSM entity type:_osmium_object_type'
}

_osmium-export() {
    _arguments : \
        ${(f)"$(_osmium-common-options)"} \
        ${(f)"$(_osmium-single-input-options)"} \
        '--fsync[call fsync after writing output file(s)]' \
        '(--output)-o[output file name]:output OSM file:_files -g "*.json *.geojson *.jsonseq *.geojsonseq"' \
        '(-o)--output[output file name]:output OSM file:_files -g "*.json *.geojson *.jsonseq *.geojsonseq"' \
        '(--overwrite)-O[allow overwriting of existing output file]' \
        '(-O)--overwrite[allow overwriting of existing output file]' \
        '(--output-format)-f[format of output file]:file format:_export_file_formats' \
        '(-f)--output-format[format of output file]:file format:_export_file_formats' \
        '(--config)-c[config file]:config file:_files -f "*.json"' \
        '(-c)--config[config file]:config file:_files -f "*.json"' \
        '(--show-errors)-e[output errors to stderr]' \
        '(-e)--show-errors[output errors to stderr]' \
        '(--stop-on-error)-E[stop on first geometry error]' \
        '(-E)--stop-on-error[stop on first geometry error]' \
        '(--index-type -I --show-index-types)-i[set index type]:index types:_osmium_export_index_types' \
        '(-i -I --show-index-types)--index-type[set index type]:index types:_osmium_export_index_types' \
        '(--help -h --verbose -v --input-format -F --fsync --output -o --overwrite -O --output-format -f --config -c --show-errors -e --stop-on-error -E --index-type -i --keep-untagged -n --omit-rs -r --add-unique-id -u --show-index-types)-I[show a list of available index types]' \
        '(--help -h --verbose -v --input-format -F --fsync --output -o --overwrite -O --output-format -f --config -c --show-errors -e --stop-on-error -E --index-type -i --keep-untagged -n --omit-rs -r --add-unique-id -u -I)--show-index-types[show a list of available index types]' \
        '(--keep-untagged)-n[keep untagged features]' \
        '(-n)--keep-untagged[keep untagged features]' \
        '(--omit-rs)-r[omit record separator when using geojsonseq format]' \
        '(-r)--omit-rs[omit record separator when using geojsonseq format]' \
        '(--add-unique-id)-u[add unique id]:unique id format:_export_id_type' \
        '(-u)--add-unique-id[add unique id]:unique id format:_export_id_type'
}

_osmium-extract() {
    _arguments : \
        ${(f)"$(_osmium-common-options)"} \
        ${(f)"$(_osmium-single-input-options)"} \
        ${(f)"$(_osmium-output-options)"} \
        ${(f)"$(_osmium-output-format-options)"} \
        '(--config -c --directory -d --polygon -p --bbox)-b[bounding box]:bounding box (format\: LEFT,BOTTOM,RIGHT,TOP):' \
        '(--config -c --directory -d --polygon -p -b)--bbox[bounding box]:bounding box (format\: LEFT,BOTTOM,RIGHT,TOP):' \
        '(--bbox -b --polygon -p --output -o --output-format -f --config)-c[specify config file]:config file:_files -g "*.json"' \
        '(--bbox -b --polygon -p --output -o --output-format -f -c)--config[specify config file]:config file:_files -g "*.json"' \
        '(--output -o --output-format -f --bbox -b --polygon -p --directory)-d[output directory]:directory:_path_files -/' \
        '(--output -o --output-format -f --bbox -b --polygon -p -d)--directory[output directory]:directory:_path_files -/' \
        "(--config -c --directory -d --bbox -b --polygon)-p[polygon file]:polygon file:_files -g ${polygon_file_glob}" \
        "(--config -c --directory -d --bbox -b -p)--polygon[polygon file]:polygon file:_files -g ${polygon_file_glob}" \
        '(--strategy)-s[use strategy for computing extract]:extract strategy:_osmium_extract_strategy' \
        '(-s)--strategy[use strategy for computing extract]:extract strategy:_osmium_extract_strategy' \
        '*-S[set strategy option]:' \
        '*--option[set strategy option]:' \
        '(--with-history)-H[input and output files are OSM history files]' \
        '(-H)--with-history[input and output files are OSM history files]'
}

_osmium-fileinfo() {
    _arguments : \
        ${(f)"$(_osmium-common-options)"} \
        ${(f)"$(_osmium-single-input-options)"} \
        '(--show-variables -G --extended)-e[show extended info (reads entire file)]' \
        '(--show-variables -G -e)--extended[show extended info (reads entire file)]' \
        '(--show-variables -G --json -j --get)-g[get value for one variable]:variable:_osmium_fileinfo_variables' \
        '(--show-variables -G --json -j -g)--get[get value for one variable]:variable:_osmium_fileinfo_variables' \
        '(--get -g --json)-j[output variables in JSON format]' \
        '(--get -g -j)--json[output variables in JSON format]' \
        '(--get -g --json -j --extended -e --show-variables)-G[show a list of all variable names]' \
        '(--get -g --json -j --extended -e -G)--show-variables[show a list of all variable names]' \
        '(--progress)--no-progress[disable progress bar]' \
        '(--no-progress)--progress[enable progress bar]'
}

_osmium-getid() {
    _arguments : \
        ${(f)"$(_osmium-common-options)"} \
        ${(f)"$(_osmium-single-input-options)"} \
        ${(f)"$(_osmium-output-format-options)"} \
        ${(f)"$(_osmium-output-options)"} \
        '--default-type[default item type]' \
        '-i[read OSM IDs from text file]' \
        '--id-file[read OSM IDs from text file]' \
        '-I[read OSM IDs from OSM file]' \
        '--id-osm-file[read OSM IDs from OSM file]' \
        '(--add-referenced)-r[recursively add referenced objects]' \
        '(-r)--add-referenced[recursively add referenced objects]' \
        '(--with-history)-H[make it work with history files]' \
        '(-H)--with-history[make it work with history files]' \
        '(--progress)--no-progress[disable progress bar]' \
        '(--no-progress)--progress[enable progress bar]' \
        "*:IDs (format\: [nwr]ID):"
}

_osmium-merge() {
    _arguments : \
        ${(f)"$(_osmium-common-options)"} \
        ${(f)"$(_osmium-multiple-inputs-options)"} \
        ${(f)"$(_osmium-output-format-options)"} \
        ${(f)"$(_osmium-output-options)"}
}

_osmium-merge-changes() {
    _arguments : \
        ${(f)"$(_osmium-common-options)"} \
        ${(f)"$(_osmium-multiple-inputs-options)"} \
        ${(f)"$(_osmium-output-format-options)"} \
        ${(f)"$(_osmium-output-options)"} \
        '(--simplify)-s[only write last version of any object]' \
        '(-s)--simplify[only write last version of any object]'
}

_osmium-renumber() {
    _arguments : \
        ${(f)"$(_osmium-common-options)"} \
        ${(f)"$(_osmium-single-input-options)"} \
        ${(f)"$(_osmium-output-format-options)"} \
        ${(f)"$(_osmium-output-options)"} \
        '(--index-directory)-i[read/write index files in this directory]:directory:_path_files -/' \
        '(-i)--index-directory[read/write index files in this directory]:directory:_path_files -/' \
        '(--progress)--no-progress[disable progress bar]' \
        '(--no-progress)--progress[enable progress bar]' \
        '*-t[renumber only objects of given output types]:OSM entity type:_osmium_object_type' \
        '*--object-type[renumber only objects of given output types]:OSM entity type:_osmium_object_type'
}

_osmium-show() {
    _arguments : \
        ${(f)"$(_osmium-common-options)"} \
        ${(f)"$(_osmium-single-input-options)"} \
        '(--output-format --format-debug -d --format-opl -o --format-xml -x)-f[format of output OSM file]:OSM file format:_osmium_output_file_formats' \
        '(-f --format-debug -d --format-opl -o --format-xml -x)--output-format[format of output OSM file]:OSM file format:_osmium_output_file_formats' \
        '(--output-format -f -d --format-opl -o --format-xml -x)--format-debug[set format of output OSM file to debug]' \
        '(--output-format -f --format-debug --format-opl -o --format-xml -x)-d[set format of output OSM file to debug]' \
        '(--output-format -f --format-debug -d -o --format-xml -x)--format-opl[set format of output OSM file to OPL]' \
        '(--output-format -f --format-debug -d --format-opl --format-xml -x)-o[set format of output OSM file to OPL]' \
        '(--output-format -f --format-debug -d --format-opl -o -x)--format-xml[set format of output OSM file to XML]' \
        '(--output-format -f --format-debug -d --format-opl -o --format-xml)-x[set format of output OSM file to XML]' \
        '--no-pager[disable pager]' \
        '*-t[read only objects of given output types]:OSM entity type:_osmium_entity_type' \
        '*--object-type[read only objects of given output types]:OSM entity type:_osmium_entity_type'
}

_osmium-sort() {
    _arguments : \
        ${(f)"$(_osmium-common-options)"} \
        ${(f)"$(_osmium-multiple-inputs-options)"} \
        ${(f)"$(_osmium-output-format-options)"} \
        ${(f)"$(_osmium-output-options)"}
}

_osmium-tags-filter() {
    _arguments : \
        ${(f)"$(_osmium-common-options)"} \
        ${(f)"$(_osmium-single-input-options)"} \
        ${(f)"$(_osmium-output-format-options)"} \
        ${(f)"$(_osmium-output-options)"} \
        '(--expressions)-e[read filter expressions from file]:filter expressions file:_files' \
        '(-e)--expressions[read filter expressions from file]:filter expressions file:_files' \
        '(--invert-match)-i[invert the sense of matching, exclude objects with matching tags]' \
        '(-i)--invert-match[invert the sense of matching, exclude objects with matching tags]' \
        '(--omit-referenced)-R[omit referenced objects]' \
        '(-R)--omit-referenced[omit referenced objects]' \
        "*:Filter expressions (format\: [nwr]*/key=[value]):"
}

_osmium-time-filter() {
    _arguments : \
        ${(f)"$(_osmium-common-options)"} \
        ${(f)"$(_osmium-single-input-options)"} \
        ${(f)"$(_osmium-output-format-options)"} \
        ${(f)"$(_osmium-output-options)"} \
        "2::start time (format\: yyyy-mm-ddThh\:mm\:ssZ):" \
        "3::end time (format\: yyyy-mm-ddThh\:mm\:ssZ):"
}

_osmium_input_file_formats() {
    _values 'OSM input file formats' \
        'osm[XML data format]' \
        'osm.gz[XML data format (compressed with gzip)]' \
        'osm.bz2[XML data format (compressed with bzip2)]' \
        'osh[XML history format]' \
        'osh.gz[XML history format (compressed with gzip)]' \
        'osh.bz2[XML history format (compressed with bzip2)]' \
        'osc[XML change format]' \
        'osc.gz[XML change format (compressed with gzip)]' \
        'osc.bz2[XML change format (compressed with bzip2)]' \
        'o5m[o5m data format]' \
        'o5c[o5c change format]' \
        'pbf[PBF format]'
}

_osmium_output_file_formats() {
    _values 'OSM output file formats' \
        'debug[Debug data format]' \
        'debug.gz[Debug data format (compressed with gzip)]' \
        'debug.bz2[Debug data format (compressed with bzip2)]' \
        'opl[OPL data format]' \
        'opl.gz[OPL data format (compressed with gzip)]' \
        'opl.bz2[OPL data format (compressed with bzip2)]' \
        'osm[XML data format]' \
        'osm.gz[XML data format (compressed with gzip)]' \
        'osm.bz2[XML data format (compressed with bzip2)]' \
        'osh[XML history format]' \
        'osh.gz[XML history format (compressed with gzip)]' \
        'osh.bz2[XML history format (compressed with bzip2)]' \
        'osc[XML change format]' \
        'osc.gz[XML change format (compressed with gzip)]' \
        'osc.bz2[XML change format (compressed with bzip2)]' \
        'pbf[PBF format]'
}

_osmium_diff_file_formats() {
    _values 'Diff file formats' \
        'opl[One object per line]' \
        'debug[Debug format]' \
        'debug,color[Debug format with color]' \
        'compact[Compact format]'
}

_osmium_object_type() {
    _values 'OSM object type' \
        'node' \
        'way' \
        'relation'
}

_osmium_entity_type() {
    _values 'OSM entity type' \
        'node' \
        'way' \
        'relation' \
        'changeset'
}

_export_file_formats() {
    _values 'export file formats' \
        'json[GeoJSON format]' \
        'geojson[GeoJSON format]' \
        'jsonseq[GeoJSON Text Sequence format]' \
        'geojsonseq[GeoJSON Text Sequence format]'
}

_export_id_type() {
    _values 'export unique id type' \
        'counter' \
        'type_id'
}

_osmium_extract_strategy() {
    _values 'extract strategy' \
        'simple' \
        'complete_ways' \
        'smart'
}

_osmium_fileinfo_variables() {
    _values 'variable' $(osmium fileinfo --show-variables)
}

_osmium_index_types() {
    _values 'index types' $(osmium add-locations-to-ways --show-index-types)
}

_osmium_export_index_types() {
    _values 'index types' $(osmium export --show-index-types)
}

_osmium-help() {
    local -a osmium_help_topics
    osmium_help_topics=(add-locations-to-ways apply-changes cat diff changeset-filter check-refs derive-changes export extract fileinfo getid help merge merge-changes renumber show sort tags-filter time-filter file-formats index-types)
    _describe -t osmium-help-topics 'osmium help topics' osmium_help_topics
}

_osmium "$@"

