#compdef riverctl
#
# Completion script for riverctl, part of river <https://github.com/riverwm/river>

_riverctl_subcommands()
{
    local -a riverctl_subcommands

    riverctl_subcommands=(
        # Actions
        'close:Close the focused view'
        'csd-filter-add:Add app-id to the CSD filter list'
        'exit:Exit the compositor, terminating the Wayland session'
        'float-filter-add:Add app-id to the float filter list'
        'focus-output:Focus the next or previous output'
        'focus-view:Focus the next or previous view in the stack'
        'move:Move the focused view in the specified direction'
        'resize:Resize the focused view along the given axis'
        'snap:Snap the focused view to the specified screen edge'
        'send-to-output:Send the focused view to the next or the previous output'
        'spawn:Run shell_command using /bin/sh -c'
        'swap:Swap the focused view with the next/previous visible non-floating view'
        'toggle-float:Toggle the floating state of the focused view'
        'toggle-fullscreen:Toggle the fullscreen state of the focused view'
        'zoom:Bump the focused view to the top of the layout stack'
        'default-layout:Set the layout namespace to be used by all outputs by default.'
        'output-layout:Set the layout namespace of currently focused output.'
        'send-layout-cmd:Send command to the layout generator on the currently focused output with matching namespace'
        # Tag management
        'set-focused-tags:Show views with tags corresponding to the set bits of tags'
        'set-view-tags:Assign the currently focused view the tags corresponding to the set bits of tags'
        'toggle-focused-tags:Toggle visibility of views with tags corresponding to the set bits of tags'
        'toggle-view-tags:Toggle the tags of the currently focused view'
        'spawn-tagmask:Set a tagmask to filter the tags assigned to newly spawned views on the focused output'
        'focus-previous-tags:Sets tags to their previous value on the focused output'
        'send-to-previous-tags:Assign the currently focused view the previous tags of the focused output'
        # Mappings
        'declare-mode:Create a new mode'
        'enter-mode:Switch to given mode if it exists'
        'map:Run command when key is pressed while modifiers are held down and in the specified mode'
        'map-pointer:Move or resize views or run command when button and modifiers are held down while in the specified mode'
        'map-switch:Run command when river receives a switch event in the specified mode'
        'unmap:Remove the mapping defined by the arguments'
        'unmap-pointer:Remove the pointer mapping defined by the arguments'
        'unmap-switch:Remove the switch mapping defined by the arguments'
        # Configuration
        'attach-mode:Configure where new views should attach to the view stack'
        'background-color:Set the background color'
        'border-color-focused:Set the border color of focused views'
        'border-color-unfocused:Set the border color of unfocused views'
        'border-color-urgent:Set the border color of urgent views'
        'border-width:Set the border width to pixels'
        'focus-follows-cursor:Configure the focus behavior when moving cursor'
        'hide-cursor:Hide cursor when typing or after inactivity'
        'set-repeat:Set the keyboard repeat rate and repeat delay'
        'set-cursor-warp:Set the cursor warp mode.'
        'xcursor-theme:Set the xcursor theme'
        # Keyboard groups
        'keyboard-group-create:Create a keyboard group'
        'keyboard-group-destroy:Destroy a keyboard group'
        'keyboard-group-add:Add a keyboard to a keyboard group'
        'keyboard-group-remove:Remove a keyboard from a keyboard group'
        'keyboard-layout:Set the keyboard layout'
        # Input
        'input:Configure input devices'
        'list-inputs:List all input devices'
        'list-input-configs:List all input configurations'
    )

    _describe -t command 'command' riverctl_subcommands
}

_riverctl_input_subcommands()
{
    local -a input_subcommands

    input_subcommands=(
        'events:Configure whether the input devices events will be used by river'
        'accel-profile:Set the pointer acceleration profile'
        'pointer-accel:Set the pointer acceleration factor'
        'click-method:Set the click method'
        'drag:Enable or disable the tap-and-drag functionality'
        'drag-lock:Enable or disable the drag lock functionality'
        'disable-while-typing:Enable or disable the disable-while-typing functionality'
        'middle-emulation:Enable or disable the middle click emulation functionality'
        'natural-scroll:Enable or disable the natural scroll functionality'
        'left-handed:Enable or disable the left handed mode'
        'tap:Enable or disable the tap functionality'
        'tap-button-map:Configure the button mapping for tapping'
        'scroll-method:Set the scroll method'
        'scroll-button:Set the scroll button'
    )

    _describe -t command 'command' input_subcommands
}

_riverctl_input()
{
    local state

    _arguments \
        '1: :->commands' \
        '*:: :->args'

    case $state in
        commands) _alternative 'common-commands:common:_riverctl_input_subcommands' ;;
        args)
            case "$words[1]" in
                events) _alternative 'input-cmds:args:(enabled disabled disabled-on-external-mouse)' ;;
                accel-profile) _alternative 'input-cmds:args:(none flat adaptive)' ;;
                click-method) _alternative 'input-cmds:args:(none button-area clickfinger)' ;;
                drag) _alternative 'input-cmds:args:(enabled disabled)' ;;
                drag-lock) _alternative 'input-cmds:args:(enabled disabled)' ;;
                disable-while-typing) _alternative 'input-cmds:args:(enabled disabled)' ;;
                middle-emulation) _alternative 'input-cmds:args:(enabled disabled)' ;;
                natural-scroll) _alternative 'input-cmds:args:(enabled disabled)' ;;
                left-handed) _alternative 'input-cmds:args:(enabled disabled)' ;;
                tap) _alternative 'input-cmds:args:(enabled disabled)' ;;
                tap-button-map) _alternative 'input-cmds:args:(left-right-middle left-middle-right)' ;;
                scroll-method) _alternative 'input-cmds:args:(none two-finger edge button)' ;;
                *) return 0 ;;
            esac
        ;;
    esac
}

_riverctl_hide_cursor_subcommands()
{
    local -a hide_cursor_subcommands

    hide_cursor_subcommands=(
        "timeout:Hide cursor if it wasn\'t moved in the last X millisecond, until it is moved again"
        'when-typing:Enable or disable whether the cursor should be hidden when pressing any non-modifier key'
    )

    _describe -t command 'command' hide_cursor_subcommands
}

_riverctl_hide_cursor()
{
    local state

    _arguments \
        '1: :->commands' \
        '*:: :->args'

    case $state in
        commands) _alternative 'common-commands:common:_riverctl_hide_cursor_subcommands' ;;
        args)
            case "$words[1]" in
                when-typing) _alternative 'hide-cursor-cmds:args:(enabled disabled)' ;;
                *) return 0 ;;
            esac
        ;;
    esac
}

_riverctl()
{
    local state

    _arguments \
        '1: :->commands' \
        '*:: :->args'

    case $state in
        commands) _alternative 'common-commands:common:_riverctl_subcommands' ;;
        args)
            case "$words[1]" in
                focus-output) _alternative 'arguments:args:(next previous)' ;;
                focus-view) _alternative 'arguments:args:(next previous)' ;;
                input) _riverctl_input ;;
                move) _alternative 'arguments:args:(up down left right)' ;;
                resize) _alternative 'arguments:args:(horizontal vertical)' ;;
                snap) _alternative 'arguments:args:(up down left right)' ;;
                send-to-output) _alternative 'arguments:args:(next previous)' ;;
                swap) _alternative 'arguments:args:(next previous)' ;;
                map) _alternative 'arguments:optional:(-release -repeat -layout)' ;;
                unmap) _alternative 'arguments:optional:(-release)' ;;
                attach-mode) _alternative 'arguments:args:(top bottom)' ;;
                focus-follows-cursor) _alternative 'arguments:args:(disabled normal always)' ;;
                set-cursor-warp) _alternative 'arguments:args:(disabled on-output-change on-focus-change)' ;;
                hide-cursor) _riverctl_hide_cursor ;;
                *) return 0 ;;
            esac
        ;;
    esac
}

_riverctl "$@"