#compdef fuzzel

_arguments \
    -s \
    '--config[path to configuration file (XDG_CONFIG_HOME/fuzzel/fuzzel.ini)]:config:_files' \
    '--cache[file to load most recently launched applications from (XDG_CACHE_HOME/fuzzel)]:cache:_files' \
    '--check-config[verify configuration and exit with 0 if ok, otherwise exit with 1]' \
    '(-v --version)'{-v,--version}'[show the version number and quit]' \
    '(-h --help)'{-h,--help}'[show help message and quit]' \
    '(-o --output)'{-o,--output}'[output (monitor) to display on (none)]:output:->outputs' \
    '(-f --font)'{-f,--font}'[font name and style in fontconfig format (monospace)]:font:->fonts' \
    '(-D --dpi-aware)'{-D,--dpi-aware}"[scale fonts using the monitor's DPI (auto)]:dpi_aware:(no yes auto)" \
    '--use-bold[allow fuzzel to use bold fonts]' \
    '--icon-theme[icon theme name (hicolor)]:theme:->icon_theme' \
    '(-I --no-icons)'{-I,--no-icons}'[do not render any icons]' \
    '--hide-before-typing[hide application list until something is typed]' \
    '(-F --fields)'{-F,--fields}'[comma separated list of XDG Desktop entry fields to match ]:fields:(filename name generic exec categories keywords comment)' \
    '(-p --prompt)'{-p,--prompt}'[string to use as input prompt ("> ")]:()' \
    '--placeholder[placeholder text in the input box]:()' \
    '--search[initial search/filter string]:()' \
    '--password[render all input using either "*", or the specified character]:()' \
    '(-T --terminal)'{-T,--terminal}'[terminal command, with arguments ($TERMINAL -e)]:terminal:_command_names -e' \
    '(-a --anchor)'{-a,--anchor}'[set window anchor (center)]:anchors:(top-left top top-right left center right bottom-left bottom bottom-right)' \
    '--x-margin[horizontal margin away from the anchor point in pixels (0)]:()' \
    '--y-margin[vertical margin away from the anchor point in pixels (0)]:()' \
    '--select[select the first entry that matches the given string]:()' \
    '(-l --lines)'{-l,--lines}'[maximum number of matches to display (15)]:()' \
    '(-w --width)'{-w,--width}'[window width, in characters (30)]:()' \
    '(-x --horizontal-pad)'{-x,--horizontal-pad}'[horizontal padding, in pixels (40)]:()' \
    '(-y --vertical-pad)'{-y,--vertical-pad}'[vertical padding, in pixels (8)]:()' \
    '(-P --inner-pad)'{-P,--inner-pad}'[vertical padding between prompt and matches, in pixels (0)]:()' \
    '(-b --background)'{-b,--background}'[background color (fdf6e3ff)]:background:()' \
    '(-t --text-color)'{-t,--text-color}'[text color (657b83ff)]:text-color:()' \
    '--prompt-color[color of the prompt text (586e75ff)]:prompt-color:()' \
    '--placeholder-color[color of the placeholder text (93a1a1ff)]:()' \
    '--input-color[color of the input string (657b83ff)]:input-color:()' \
    '(-m --match-color)'{-m,--match-color}'[color of matched substring (cb4b16ff)]:match-color:()' \
    '(-s --selection-color)'{-s,--selection-color}'[background color of selected item (eee8d5ff)]:selection-color:()' \
    '(-S --selection-text-color)'{-S,--selection-text-color}'[text color of selected item (586e75ff)]:selection-text-color:()' \
    '(-M --selection-match-color)'{-M,--selection-match-color}'[color of matched substring of selected item (cb4b16ff)]:match-color:()' \
    '--counter-color[color of the match count (93a1a1ff)]:counter-color:()' \
    '(-B --border-width)'{-B,--border-width}'[width of border, in pixels (1)]:border-width:()' \
    '(-r --border-radius)'{-r,--border-radius}'[amount of corner "roundness" (10)]:border-radius:()' \
    '(-C --border-color)'{-C,--border-color}'[border color (002b36ff)]:border-color:()' \
    '--show-actions[include desktop actions (e.g "New Window") in the list]' \
    '--match-mode[how to match what you type against the entries (fzf)]:match_mode:(exact fzf fuzzy)' \
    '--no-sort[do not sort the result]' \
    '--counter[display the match count]' \
    '--filter-desktop=-[filter desktop entries based on XDG_CURRENT_DESKTOP]: :(no)' \
    '--list-executables-in-path[list executables present in the PATH environment variable]'\
    '--fuzzy-min-length[search strings shorter than this will not be fuzzy matched (3)]:()' \
    '--fuzzy-max-length-discrepancy[maximum allowed length difference between the search string and a fuzzy match (2)]:()' \
    '--fuzzy-max-distance[maximum allowed levenshtein distance between the search string and a fuzzy match (1)]:()' \
    '--line-height[override line height from font metrics, in points or pixels]:()' \
    '--letter-spacing[additional letter spacing, in points or pixels]:()' \
    '--layer[which layer to render the fuzzel window on (top)]:layer:(top overlay)' \
    '--render-workers[number of render worker threads]:render-workers:()' \
    '--match-workers[number of match worker threads]:match-workers:()' \
    '--delayed-filter-ms[time in milliseconds to delay refiltering when there are lots of matches]:delayed-filter-ms:()' \
    '--delayed-filter-limit[switch to delayed refiltering when there are more matches than this]:delayed-filter-limit:()' \
    '(-d --dmenu)'{-d,--dmenu}'[dmenu compatibility mode; entries are read from stdin, newline separated]' \
    '--dmenu0[dmenu compatibility mode; entries are read from stdin, NUL separated]' \
    "--index[print selected entry's index instead of its text (dmenu mode only)]" \
    '(-R --no-run-if-empty)'{-R,--no-run-if-empty}'[exit immediately without showing the UI if stdin is empty (dmenu mode only)]' \
    '--log-level[log level (warning)]:loglevel:(info warning error none)' \
    '--log-colorize[enable or disable colorization of log output on stderr]:logcolor:(never always auto)' \
    '--log-no-syslog[disable syslog logging]'

case "${state}" in
    fonts)
        if command -v fc-list > /dev/null; then
            _values 'font families' $(fc-list : family | tr -d ' ')
        fi
        ;;

    icon_theme)
        _values 'icon themes' $(find /usr/share/icons -mindepth 1 -maxdepth 1 -type d -print0 | xargs -0 -n 1 basename | sort)
        ;;

    outputs)
        if command -v wlr-randr > /dev/null; then
            _values 'outputs' $(wlr-randr | grep -e '^[^[:space:]]\+' | cut -d ' ' -f 1)
        elif command -v swaymsg > /dev/null; then
            _values 'outputs' $(swaymsg -t get_outputs --raw|grep name|cut -d '"' -f 4)
        fi
        ;;
esac
