#compdef alacritty

# Completions available for the first parameter.
_alacritty_first_param() {
    # Main subcommands.
    _describe "command" "(msg:'Available socket messages')"

    # Default options.
    _alacritty_main
}

# Completions available for parameters after the first.
_alacritty_following_param() {
    case $words[2] in
      msg)
        _alacritty_msg;;
      *)
        _alacritty_main;;
    esac
}

# Completions for the main Alacritty executable.
_alacritty_main() {
  # Limit some suggestions to the first option.
  local ignore
  (( $#words > 2 )) && ignore='!'

  _arguments \
    "$ignore(-)"{-h,--help}"[print help information]" \
    "$ignore(-)"{-V,--version}"[print version information]" \
    "--print-events[print all events to stdout]" \
    '(-v)'{-q,-qq}"[reduce the level of verbosity (min is -qq)]" \
    "--ref-test[generate ref test]" \
    "--hold[remain open after child process exits]" \
    '(-q)'{-v,-vv,-vvv}"[increase the level of verbosity (max is -vvv)]" \
    "--class=[define the window class]:class" \
    "--embed=[define the X11 window ID (as a decimal integer) to embed Alacritty within]:windowId" \
    "(-e --command)"{-e,--command}"[execute command (must be last arg)]:program: _command_names -e:*::program arguments: _normal" \
    "--config-file=[specify an alternative config file]:file:_files" \
    "*"{-o=,--option=}"[override config file options]:option" \
    "(-t --title)"{-t=,--title=}"[define the window title]:title" \
    "--working-directory=[start shell in specified directory]:directory:_directories"\
    "--socket=[Path for IPC socket creation]:file:_files"
}

# Completions for the `msg` subcommand.
_alacritty_msg() {
  # Limit some suggestions to the first option.
  local ignore
  (( $#words > 3 )) && ignore='!'

  _arguments \
    "$ignore(-)"{-h,--help}"[print help information]" \
    "$ignore(-)"{-V,--version}"[print version information]" \
    "(-s --socket)"{-s=,--socket=}"[Path for IPC socket creation]:file:_files" \
    "*: :((create-window:'Create a new window in the same Alacritty process'))"
}

# Handle arguments based on their position.
_arguments \
  "1: :_alacritty_first_param" \
  "*: :_alacritty_following_param"
