#compdef ghostty

_fonts () {
  local font_list=$(ghostty +list-fonts | grep -Z '^[A-Z]')
  local fonts=(${(f)font_list})
  _describe -t fonts 'fonts' fonts
}

_themes() {
  local theme_list=$(ghostty +list-themes | sed -E 's/^(.*) \(.*$/\1/')
  local themes=(${(f)theme_list})
  _describe -t themes 'themes' themes
}
_config() {
  _arguments \
    "--help" \
    "--version" \
    "--language=-:::( )" \
    "--font-family=-:::_fonts" \
    "--font-family-bold=-:::_fonts" \
    "--font-family-italic=-:::_fonts" \
    "--font-family-bold-italic=-:::_fonts" \
    "--font-style=-:::( )" \
    "--font-style-bold=-:::( )" \
    "--font-style-italic=-:::( )" \
    "--font-style-bold-italic=-:::( )" \
    "--font-synthetic-style=-:::(bold no-bold italic no-italic bold-italic no-bold-italic)" \
    "--font-feature=-:::( )" \
    "--font-size=-:::( )" \
    "--font-variation=-:::( )" \
    "--font-variation-bold=-:::( )" \
    "--font-variation-italic=-:::( )" \
    "--font-variation-bold-italic=-:::( )" \
    "--font-codepoint-map=-:::( )" \
    "--clipboard-codepoint-map=-:::( )" \
    "--font-thicken" \
    "--font-thicken-strength=-:::( )" \
    "--font-shaping-break=-:::(cursor no-cursor)" \
    "--alpha-blending=-:::(native linear linear-corrected)" \
    "--adjust-cell-width=-:::( )" \
    "--adjust-cell-height=-:::( )" \
    "--adjust-font-baseline=-:::( )" \
    "--adjust-underline-position=-:::( )" \
    "--adjust-underline-thickness=-:::( )" \
    "--adjust-strikethrough-position=-:::( )" \
    "--adjust-strikethrough-thickness=-:::( )" \
    "--adjust-overline-position=-:::( )" \
    "--adjust-overline-thickness=-:::( )" \
    "--adjust-cursor-thickness=-:::( )" \
    "--adjust-cursor-height=-:::( )" \
    "--adjust-box-thickness=-:::( )" \
    "--adjust-icon-height=-:::( )" \
    "--grapheme-width-method=-:::(legacy unicode)" \
    "--freetype-load-flags=-:::(hinting no-hinting force-autohint no-force-autohint monochrome no-monochrome autohint no-autohint light no-light)" \
    "--theme=-:::_themes" \
    "--background=-:::( )" \
    "--foreground=-:::( )" \
    "--background-image=-:::( )" \
    "--background-image-opacity=-:::( )" \
    "--background-image-position=-:::(top-left top-center top-right center-left center-center center-right bottom-left bottom-center bottom-right center)" \
    "--background-image-fit=-:::(contain cover stretch none)" \
    "--background-image-repeat" \
    "--selection-foreground=-:::( )" \
    "--selection-background=-:::( )" \
    "--selection-clear-on-typing" \
    "--selection-clear-on-copy" \
    "--selection-word-chars=-:::( )" \
    "--minimum-contrast=-:::( )" \
    "--palette=-:::( )" \
    "--palette-generate" \
    "--palette-harmonious" \
    "--cursor-color=-:::( )" \
    "--cursor-opacity=-:::( )" \
    "--cursor-style=-:::(bar block underline block_hollow)" \
    "--cursor-style-blink=-:::( )" \
    "--cursor-text=-:::( )" \
    "--cursor-click-to-move" \
    "--mouse-hide-while-typing" \
    "--scroll-to-bottom=-:::(keystroke no-keystroke output no-output)" \
    "--mouse-shift-capture=-:::(false true always never)" \
    "--mouse-reporting" \
    "--mouse-scroll-multiplier=-:::( )" \
    "--background-opacity=-:::( )" \
    "--background-opacity-cells" \
    "--background-blur=-:::( )" \
    "--unfocused-split-opacity=-:::( )" \
    "--unfocused-split-fill=-:::( )" \
    "--split-divider-color=-:::( )" \
    "--split-preserve-zoom=-:::(navigation no-navigation)" \
    "--search-foreground=-:::( )" \
    "--search-background=-:::( )" \
    "--search-selected-foreground=-:::( )" \
    "--search-selected-background=-:::( )" \
    "--command=-:::( )" \
    "--initial-command=-:::( )" \
    "--notify-on-command-finish=-:::(never unfocused always)" \
    "--notify-on-command-finish-action=-:::(bell no-bell notify no-notify)" \
    "--notify-on-command-finish-after=-:::( )" \
    "--env=-:::( )" \
    "--input=-:::( )" \
    "--wait-after-command" \
    "--abnormal-command-exit-runtime=-:::( )" \
    "--scrollback-limit=-:::( )" \
    "--scrollbar=-:::(system never)" \
    "--link=-:::( )" \
    "--link-url" \
    "--link-previews=-:::(false true osc8)" \
    "--maximize" \
    "--fullscreen=-:::(false true non-native non-native-visible-menu non-native-padded-notch)" \
    "--title=-:::( )" \
    "--class=-:::( )" \
    "--x11-instance-name=-:::( )" \
    "--working-directory=-:::{_files -/}" \
    "--keybind=-:::( )" \
    "--key-remap=-:::( )" \
    "--window-padding-x=-:::( )" \
    "--window-padding-y=-:::( )" \
    "--window-padding-balance" \
    "--window-padding-color=-:::(background extend extend-always)" \
    "--window-vsync" \
    "--window-inherit-working-directory" \
    "--tab-inherit-working-directory" \
    "--split-inherit-working-directory" \
    "--window-inherit-font-size" \
    "--window-decoration=-:::(auto client server none)" \
    "--window-title-font-family=-:::( )" \
    "--window-subtitle=-:::(false working-directory)" \
    "--window-theme=-:::(auto system light dark ghostty)" \
    "--window-colorspace=-:::(srgb display-p3)" \
    "--window-height=-:::( )" \
    "--window-width=-:::( )" \
    "--window-position-x=-:::( )" \
    "--window-position-y=-:::( )" \
    "--window-save-state=-:::(default never always)" \
    "--window-step-resize" \
    "--window-new-tab-position=-:::(current end)" \
    "--window-show-tab-bar=-:::(always auto never)" \
    "--window-titlebar-background=-:::( )" \
    "--window-titlebar-foreground=-:::( )" \
    "--resize-overlay=-:::(always never after-first)" \
    "--resize-overlay-position=-:::(center top-left top-center top-right bottom-left bottom-center bottom-right)" \
    "--resize-overlay-duration=-:::( )" \
    "--focus-follows-mouse" \
    "--clipboard-read=-:::(allow deny ask)" \
    "--clipboard-write=-:::(allow deny ask)" \
    "--clipboard-trim-trailing-spaces" \
    "--clipboard-paste-protection" \
    "--clipboard-paste-bracketed-safe" \
    "--title-report" \
    "--image-storage-limit=-:::( )" \
    "--copy-on-select=-:::(false true clipboard)" \
    "--right-click-action=-:::(ignore paste copy copy-or-paste context-menu)" \
    "--click-repeat-interval=-:::( )" \
    "--config-file=-:::_files" \
    "--config-default-files" \
    "--confirm-close-surface=-:::(false true always)" \
    "--quit-after-last-window-closed" \
    "--quit-after-last-window-closed-delay=-:::( )" \
    "--initial-window" \
    "--undo-timeout=-:::( )" \
    "--quick-terminal-position=-:::(top bottom left right center)" \
    "--quick-terminal-size=-:::( )" \
    "--gtk-quick-terminal-layer=-:::(overlay top bottom background)" \
    "--gtk-quick-terminal-namespace=-:::( )" \
    "--quick-terminal-screen=-:::(main mouse macos-menu-bar)" \
    "--quick-terminal-animation-duration=-:::( )" \
    "--quick-terminal-autohide" \
    "--quick-terminal-space-behavior=-:::(remain move)" \
    "--quick-terminal-keyboard-interactivity=-:::(none on-demand exclusive)" \
    "--shell-integration=-:::(none detect bash elvish fish nushell zsh)" \
    "--shell-integration-features=-:::(cursor no-cursor sudo no-sudo title no-title ssh-env no-ssh-env ssh-terminfo no-ssh-terminfo path no-path)" \
    "--command-palette-entry=-:::( )" \
    "--osc-color-report-format=-:::(none 8-bit 16-bit)" \
    "--vt-kam-allowed" \
    "--custom-shader=-:::_files" \
    "--custom-shader-animation=-:::(false true always)" \
    "--bell-features=-:::(system no-system audio no-audio attention no-attention title no-title border no-border)" \
    "--bell-audio-path=-:::( )" \
    "--bell-audio-volume=-:::( )" \
    "--app-notifications=-:::(clipboard-copy no-clipboard-copy config-reload no-config-reload)" \
    "--macos-non-native-fullscreen=-:::(false true visible-menu padded-notch)" \
    "--macos-window-buttons=-:::(visible hidden)" \
    "--macos-titlebar-style=-:::(native transparent tabs hidden)" \
    "--macos-titlebar-proxy-icon=-:::(visible hidden)" \
    "--macos-dock-drop-behavior=-:::(new-tab new-window)" \
    "--macos-option-as-alt=-:::( )" \
    "--macos-window-shadow" \
    "--macos-hidden=-:::(never always)" \
    "--macos-auto-secure-input" \
    "--macos-secure-input-indication" \
    "--macos-applescript" \
    "--macos-icon=-:::(official blueprint chalkboard microchip glass holographic paper retro xray custom custom-style)" \
    "--macos-custom-icon=-:::( )" \
    "--macos-icon-frame=-:::(aluminum beige plastic chrome)" \
    "--macos-icon-ghost-color=-:::( )" \
    "--macos-icon-screen-color=-:::( )" \
    "--macos-shortcuts=-:::(allow deny ask)" \
    "--linux-cgroup=-:::(never always single-instance)" \
    "--linux-cgroup-memory-limit=-:::( )" \
    "--linux-cgroup-processes-limit=-:::( )" \
    "--linux-cgroup-hard-fail" \
    "--gtk-opengl-debug" \
    "--gtk-single-instance=-:::(false true detect)" \
    "--gtk-titlebar" \
    "--gtk-tabs-location=-:::(top bottom)" \
    "--gtk-titlebar-hide-when-maximized" \
    "--gtk-toolbar-style=-:::(flat raised raised-border)" \
    "--gtk-titlebar-style=-:::(native tabs)" \
    "--gtk-wide-tabs" \
    "--gtk-custom-css=-:::_files" \
    "--desktop-notifications" \
    "--progress-style" \
    "--bold-color=-:::( )" \
    "--faint-opacity=-:::( )" \
    "--term=-:::( )" \
    "--enquiry-response=-:::( )" \
    "--async-backend=-:::(auto epoll io_uring)" \
    "--auto-update=-:::( )" \
    "--auto-update-channel=-:::( )" \

}

_ghostty() {
  typeset -A opt_args
  local context state line
  local opt=('-e' '--help' '--version')

  _arguments -C \
    '1:actions:->actions' \
    '*:: :->rest' \

  if [[ "$line[1]" == "--help" || "$line[1]" == "--version" || "$line[1]" == "-e" ]]; then
    return
  fi

  if [[ "$line[1]" == -* ]]; then
    _config
    return
  fi

  case "$state" in
    (actions)
      local actions; actions=(
        '+version'
        '+help'
        '+list-fonts'
        '+list-keybinds'
        '+list-themes'
        '+list-colors'
        '+list-actions'
        '+ssh-cache'
        '+edit-config'
        '+show-config'
        '+validate-config'
        '+show-face'
        '+crash-report'
        '+boo'
        '+new-window'
      )
      _describe '' opt
      _describe -t action 'action' actions
    ;;
    (rest)
      if [[ "$line[2]" == "--help" ]]; then
        return
      fi

      local help=('--help')
      _describe '' help

      case $line[1] in
        (+help)
          _arguments \
            '--help' \
        ;;
        (+list-fonts)
          _arguments \
            '--family=-:::( )' \
            '--style=-:::( )' \
            '--bold' \
            '--italic' \
        ;;
        (+list-keybinds)
          _arguments \
            '--default' \
            '--docs' \
            '--plain' \
        ;;
        (+list-themes)
          _arguments \
            '--path' \
            '--plain' \
            '--color=-:::(all dark light)' \
        ;;
        (+list-colors)
          _arguments \
            '--plain' \
        ;;
        (+list-actions)
          _arguments \
            '--docs' \
        ;;
        (+ssh-cache)
          _arguments \
            '--clear' \
            '--add=-:::( )' \
            '--remove=-:::( )' \
            '--host=-:::( )' \
            '--expire-days=-:::( )' \
        ;;
        (+show-config)
          _arguments \
            '--default' \
            '--changes-only' \
            '--docs' \
        ;;
        (+validate-config)
          _arguments \
            '--config-file=-:::_files' \
        ;;
        (+show-face)
          _arguments \
            '--cp=-:::( )' \
            '--string=-:::( )' \
            '--style=-:::(regular bold italic bold_italic)' \
            '--presentation=-:::(text emoji)' \
        ;;
        (+new-window)
          _arguments \
            '--class=-:::( )' \
        ;;
      esac
    ;;
  esac
}

_ghostty "$@"
