#compdef winehelper
# shellcheck disable=SC2034,SC2206
_winehelper() {
  local -a opts wine_cmd scripts installed prefixes

  opts=(
    '--help[Вывести справку]'
    '--version[Показать информацию о пакете и его версии]'
    '--debug[Режим отладки]'
    'install[Запустить скрипт установки программы]'
    'install-dxvk[Установить/удалить DXVK]'
    'install-vkd3d[Установить/удалить VKD3D]'
    'installed[Список установленных программ]'
    '-r[Запуск программы (отладка)]'
    '-i[Запустить скрипт установки программы]'
    'remove-all[Удалить WineHelper и все связанные данные]'
    '--clear-pfx[Очистить префикс \[имя_префикса\]]'
    'killall[Убить все процессы]'
    'create-prefix[Создать новый префикс]'
    'remove-prefix[Удалить префикс и все связанные данные]'
    'backup-prefix[Создать резерную копию префикса]'
    'restore-prefix[восстановить префикс из резервной копии "путь/до/whpack"]'
    'change-wine[Изменить версию Wine для префикса]'
    'clear-winetricks-cache[Очистить кэш Winetricks]'
  )

  wine_cmd=(
    winecfg
    winereg
    winefile
    wineconsole
    winetricks
    desktop
    regedit
    explorer
    cmd
    'run[Запуск программы (отладка)]'
  )

  local context state line
  _arguments -C \
    '1:command:->cmds' \
    '2:subcommand or argument:->args'

  case $state in
    cmds)
      _values 'winehelper options' "${opts[@]}" "${wine_cmd[@]}"
      ;;
    args)
      case $words[2] in
        --debug)
          _values 'wine commands' "${wine_cmd[@]}"
          ;;
        install|-i)
          _get_list_for_install
          ;;
        run|installed)
          _get_installed_list
          ;;
        remove-prefix|backup-prefix)
          _get_prefixes
          ;;
        create-prefix)
          ;;
        restore-prefix)
          _files
          ;;
        install-dxvk)
          _get_component_versions 'install-dxvk'
          ;;
        install-vkd3d)
          _get_component_versions 'install-vkd3d'
          ;;
        change-wine)
          _get_wine_versions
          ;;
        *)
          _values 'winehelper options' "${opts[@]}" "${wine_cmd[@]}"
          ;;
      esac
      ;;
  esac
}

_get_component_versions () {
  local component_command=$1
  local -a versions

  versions=( ${(f)"$(winehelper "${component_command}" list 2>/dev/null | grep ' - ' | sed 's/ - //')" } )
  versions+=(none list)

  _values 'versions' "${versions[@]}"
}

_get_wine_versions () {
  local -a versions
  local sha256_file="/usr/share/winehelper/sha256sum.list"

  if [[ -f "$sha256_file" ]]; then
    versions=( ${(f)"$(awk '
        /^#+\s*(WINE|WINE_LG|PROTON_LG|PROTON_STEAM)\s*#*$/ { in_group=1 }
        /^#+/ { if (! ($0 ~ /^#+\s*(WINE|WINE_LG|PROTON_LG|PROTON_STEAM)\s*#*$/)) in_group=0 }
        /^[a-f0-9]{64}/ && in_group { sub(/\.tar\.xz$/, "", $2); print $2 }
    ' "$sha256_file" 2>/dev/null)"} )
  fi

  versions+=(system)
  _values 'wine versions' "${versions[@]}"
}

_get_prefixes () {
  prefixes=( ${(f)"$(ls -1 ~/.local/share/winehelper/prefixes 2>/dev/null)"} )

  if ((! ${#prefixes[@]} == 0 )); then
    _values 'prefixes' "${prefixes[@]}"
  fi
}

_get_list_for_install () {
  
  packages=(${(f)"$(winehelper install list 2>/dev/null |
    awk -F ' - ' '
      /^[^ ]+ - \("/ {next}
      /^[[:space:]]*$/ {next}
      /^Информация:/ {next}
      /^[^ ]+ - / {
        name=$1;
        desc=$2;
        gsub(/^[[:space:]]+|[[:space:]]+$/, "", name);
        gsub(/^[[:space:]]*"?|"?[[:space:]]*$/, "", desc);
        if (name && desc) print name ":" desc
      }
    ')"})
  
  packages+=(
    scadoffice:"SCAD Office"
    t-flex-cad17-applications:"Приложения для T-FLEX CAD 17"
    t-flex-cad17-resources:"Обучающие материалы T-FLEX CAD 17"
  )

    _describe 'packages' packages
}

_get_installed_list () {
  installed=(
    ${(f)"$(ls -1 ~/.local/share/winehelper/ | grep ".desktop" | sed 's/.desktop//')"}
  )

  if ((! ${#installed[@]} == 0 )); then
    _values 'installed apps' "${installed[@]}"
  fi
}

compdef _winehelper winehelper
