#!/bin/bash

_treehouses_complete()
{
  local idx subcmds
  every_command=""
  read -r -d '' every_command <<EOF || true
treehouses ap internet
treehouses ap local
treehouses apchannel
treehouses aphidden internet
treehouses aphidden local
treehouses blocker
treehouses blocker 0
treehouses blocker 1
treehouses blocker 2
treehouses blocker 3
treehouses blocker 4
treehouses blocker max
treehouses bluetooth button
treehouses bluetooth id
treehouses bluetooth id number
treehouses bluetooth log
treehouses bluetooth log follow
treehouses bluetooth mac
treehouses bluetooth off
treehouses bluetooth on
treehouses bluetooth pause
treehouses bluetooth restart
treehouses bluetooth status
treehouses bootoption console
treehouses bootoption console autologin
treehouses bootoption desktop
treehouses bootoption desktop autologin
treehouses bootoption modules
treehouses bootoption params
treehouses bridge
treehouses burn
treehouses button bluetooth
treehouses button off
treehouses camera
treehouses camera capture
treehouses camera detect
treehouses camera off
treehouses camera on
treehouses changelog
treehouses changelog compare
treehouses changelog view
treehouses clone
treehouses clone detect
treehouses config
treehouses config add
treehouses config clear
treehouses config delete
treehouses config update
treehouses container
treehouses container balena
treehouses container docker
treehouses container none
treehouses convert
treehouses coralenv demo-always-on
treehouses coralenv demo-off
treehouses coralenv demo-on
treehouses coralenv install
treehouses cron
treehouses cron 0W
treehouses cron add
treehouses cron delete
treehouses cron deleteall
treehouses cron list
treehouses cron timestamp
treehouses cron tor
treehouses default
treehouses default network
treehouses default notice
treehouses default tunnel
treehouses detect
treehouses detect arch
treehouses detect arm
treehouses detect bluetooth
treehouses detect rpi
treehouses detect rpi full
treehouses detect rpi model
treehouses detect wifi
treehouses discover gateway
treehouses discover gateway list
treehouses discover interface
treehouses discover mac
treehouses discover ping
treehouses discover ports
treehouses discover rpi
treehouses discover scan
treehouses discover self
treehouses discover wifi
treehouses ethernet
treehouses expandfs
treehouses feedback
treehouses gpio
treehouses help
treehouses help ap
treehouses help apchannel
treehouses help aphidden
treehouses help blocker
treehouses help bluetooth
treehouses help bootoption
treehouses help bridge
treehouses help burn
treehouses help button
treehouses help camera
treehouses help changelog
treehouses help clone
treehouses help container
treehouses help coralenv
treehouses help cron
treehouses help default
treehouses help detect
treehouses help discover
treehouses help ethernet
treehouses help expandfs
treehouses help feedback
treehouses help image
treehouses help internet
treehouses help led
treehouses help locale
treehouses help log
treehouses help magazine
treehouses help memory
treehouses help networkmode
treehouses help ntp
treehouses help openvpn
treehouses help password
treehouses help rebootneeded
treehouses help reboots
treehouses help redirect
treehouses help remote
treehouses help rename
treehouses help restore
treehouses help rtc
treehouses help sdbench
treehouses help services
treehouses help speedtest
treehouses help ssh
treehouses help sshkey
treehouses help sshtunnel
treehouses help staticwifi
treehouses help storage
treehouses help temperature
treehouses help timezone
treehouses help tor
treehouses help upgrade
treehouses help usb
treehouses help verbose
treehouses help version
treehouses help vnc
treehouses help wifi
treehouses help wificountry
treehouses help wifihidden
treehouses help wifistatus
treehouses image
treehouses inspire
treehouses inspire fact
treehouses inspire joke
treehouses inspire qotd
treehouses inspire random
treehouses internet
treehouses internet reverse
treehouses led
treehouses led blackhistorymonth
treehouses led carnival
treehouses led christmas
treehouses led dance
treehouses led diwali
treehouses led dragonboat
treehouses led easter
treehouses led eid
treehouses led green
treehouses led green backlight
treehouses led green cpu0
treehouses led green default-on
treehouses led green gpio
treehouses led green heartbeat
treehouses led green input
treehouses led green kbd-
treehouses led green none
treehouses led green oneshot
treehouses led green timer
treehouses led heavymetal
treehouses led independenceday
treehouses led kecak
treehouses led labourday
treehouses led lantern
treehouses led lunarnewyear
treehouses led newyear
treehouses led onam
treehouses led random
treehouses led red
treehouses led red backlight
treehouses led red cpu0
treehouses led red default-on
treehouses led red gpio
treehouses led red heartbeat
treehouses led red input
treehouses led red kbd-
treehouses led red none
treehouses led red oneshot
treehouses led red timer
treehouses led sandstorm
treehouses led stpatricks
treehouses led thanksgiving
treehouses led valentine
treehouses locale
treehouses log
treehouses log 0
treehouses log 1
treehouses log 2
treehouses log 3
treehouses log 4
treehouses log max
treehouses log show
treehouses log show 5
treehouses magazines available
treehouses magazines downloaded
$(magazines_cmds)
treehouses memory
treehouses memory free
treehouses memory free gb
treehouses memory free mb
treehouses memory gb
treehouses memory mb
treehouses memory total
treehouses memory total gb
treehouses memory total mb
treehouses memory used
treehouses memory used gb
treehouses memory used mb
treehouses message discord apitoken
treehouses message discord authorize
treehouses message gitter apitoken
treehouses message gitter authorize
treehouses message gitter mark
treehouses message gitter read
treehouses message gitter send
treehouses message gitter show
treehouses message slack apitoken
treehouses message slack channels
treehouses message slack mark
treehouses message slack read
treehouses message slack send
treehouses message slack show
treehouses networkmode
treehouses networkmode info
treehouses ntp internet
treehouses ntp local
treehouses openvpn
treehouses openvpn delete
treehouses openvpn load
treehouses openvpn notice
treehouses openvpn notice add
treehouses openvpn notice delete
treehouses openvpn notice list
treehouses openvpn notice off
treehouses openvpn notice on
treehouses openvpn show
treehouses openvpn start
treehouses openvpn stop
treehouses openvpn use
treehouses password change
treehouses password disable
treehouses password enable
treehouses picture
treehouses power conservative
treehouses power current
treehouses power default
treehouses power freq
treehouses power ondemand
treehouses power performance
treehouses power powersave
treehouses power status
treehouses power userspace
treehouses rebootneeded
treehouses reboots
treehouses reboots cron
treehouses reboots daily
treehouses reboots in
treehouses reboots monthly
treehouses reboots now
treehouses reboots weekly
treehouses redirect add
treehouses redirect list
treehouses redirect remove
treehouses redirect start
treehouses remote allservices
treehouses remote check
treehouses remote commands
treehouses remote help
treehouses remote key receive
treehouses remote key send
treehouses remote reverse
treehouses remote services available
treehouses remote services installed
treehouses remote services running
treehouses remote ssh2fa
treehouses remote status
treehouses remote statuspage
treehouses remote upgrade
treehouses remote version
treehouses rename
treehouses resolution
treehouses restore
treehouses rtc off
treehouses rtc on
treehouses rtc on ds3231
treehouses rtc on rasclock
treehouses sdbench
treehouses services available
treehouses services installed
treehouses services installed full
$(services_cmds)
treehouses services ports
treehouses services running
treehouses services running full
treehouses shadowsocks
treehouses shadowsocks add
treehouses shadowsocks disable
treehouses shadowsocks enable
treehouses shadowsocks enter
treehouses shadowsocks list
treehouses shadowsocks remove
treehouses shadowsocks restart
treehouses shadowsocks start
treehouses shadowsocks stop
treehouses shutdown
treehouses shutdown force
treehouses shutdown in
treehouses shutdown now
treehouses speedtest
treehouses speedtest -h
treehouses ssh
treehouses ssh 2fa
treehouses ssh 2fa add
treehouses ssh 2fa disable
treehouses ssh 2fa enable
treehouses ssh 2fa remove
treehouses ssh 2fa show
treehouses ssh 2fa list
treehouses ssh fingerprint
treehouses ssh off
treehouses ssh on
treehouses sshkey add
treehouses sshkey delete
treehouses sshkey deleteall
treehouses sshkey github addteam
treehouses sshkey github adduser
treehouses sshkey github deleteuser
treehouses sshkey list
treehouses sshtunnel
treehouses sshtunnel active
treehouses sshtunnel add host
treehouses sshtunnel add port actual
treehouses sshtunnel add port offset
treehouses sshtunnel check
treehouses sshtunnel key
treehouses sshtunnel key receive private
treehouses sshtunnel key receive public
treehouses sshtunnel key name
treehouses sshtunnel key send private
treehouses sshtunnel key send public
treehouses sshtunnel key verify
treehouses sshtunnel list
treehouses sshtunnel notice
treehouses sshtunnel notice add
treehouses sshtunnel notice delete
treehouses sshtunnel notice list
treehouses sshtunnel notice now
treehouses sshtunnel notice off
treehouses sshtunnel notice on
treehouses sshtunnel ports
treehouses sshtunnel refresh
treehouses sshtunnel remove all
treehouses sshtunnel remove host
treehouses sshtunnel remove port
treehouses staticwifi
treehouses storage free
treehouses storage free gb
treehouses storage free kb
treehouses storage free mb
treehouses storage gb
treehouses storage kb
treehouses storage mb
treehouses storage total
treehouses storage total gb
treehouses storage total kb
treehouses storage total mb
treehouses storage used
treehouses storage used gb
treehouses storage used kb
treehouses storage used mb
treehouses system
treehouses system all
treehouses system cpu
treehouses system cputask
treehouses system disk
treehouses system ram
treehouses system ramtask
treehouses system temperature
treehouses system volt
treehouses temperature
treehouses temperature celsius
treehouses temperature fahrenheit
treehouses temperature kelvin
treehouses tether
treehouses timezone
treehouses tor
treehouses tor add
treehouses tor delete
treehouses tor deleteall
treehouses tor destroy
treehouses tor list
treehouses tor notice
treehouses tor notice add
treehouses tor notice delete
treehouses tor notice list
treehouses tor notice now
treehouses tor notice off
treehouses tor notice on
treehouses tor ports
treehouses tor refresh
treehouses tor start
treehouses tor status
treehouses tor stop
treehouses upgrade
treehouses upgrade bluetooth
treehouses upgrade check
treehouses upgrade cli
treehouses upgrade force
treehouses uptime
treehouses uptime boot
treehouses uptime log
treehouses uptime start
treehouses uptime stop
treehouses usb
treehouses usb off
treehouses usb on
treehouses verbose
treehouses verbose off
treehouses verbose on
treehouses version
treehouses version contributors
treehouses version remote
treehouses vnc
treehouses vnc auth info
treehouses vnc auth system
treehouses vnc auth vnc
treehouses vnc info
treehouses vnc off
treehouses vnc on
treehouses vnc password
treehouses wifi
treehouses wificountry
treehouses wifihidden
treehouses wifistatus
EOF
# COMP_LINE is the line you typed in terminal
# COMP_WORDS is array form of COMP_LINE
# COMP_CWORD is the word your currently on that you typed
# awk : grab next word after what you typed available in every_command
# uniq : remove duplicate lines because next word is in many commands
# sed : change newlines to spaces
  idx=$COMP_CWORD
  ((idx=idx+1)) # We want the next word
  subcmds=$(echo -e "${every_command}\n${every_command//treehouses/.\/cli.sh}" \
    | grep "$COMP_LINE" \
    | awk -v idx="$idx" '{print $idx}' \
    | uniq \
    | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ /g')
  # COMPREPLY is what bash reads when you do tabtab So our completion goes in there
  COMPREPLY=( $(compgen -W "${subcmds}" -- ${COMP_WORDS[COMP_CWORD]}) )
}

function services_cmds {
  while IFS= read -r line;
  do
    printf "treehouses services $line
treehouses services $line autorun
treehouses services $line autorun false
treehouses services $line autorun true
treehouses services $line cleanup
treehouses services $line down
treehouses services $line config
treehouses services $line config available
treehouses services $line config edit
treehouses services $line config edit request
treehouses services $line config edit send
treehouses services $line config edit vim
treehouses services $line config new
treehouses services $line config select
treehouses services $line icon
treehouses services $line icon oneline
treehouses services $line info
treehouses services $line install
treehouses services $line port
treehouses services $line ps
treehouses services $line restart
treehouses services $line size
treehouses services $line start
treehouses services $line stop
treehouses services $line up
treehouses services $line url
treehouses services $line url local
treehouses services $line url tor\n"
  done <<< "$(find "$(which treehouses | sed 's/bin\/treehouses//')"lib/node_modules/@treehouses/cli/services -type f -printf "%f\n" | grep .sh | sed 's/install-//' | sed 's/.sh//')"
}

function magazines_cmds {
  while IFS= read -r line;
  do
    printf "treehouses magazines $line
treehouses magazines $line all
treehouses magazines $line latest
treehouses magazines $line list
treehouses magazines $line url\n"
  done <<< "$(find "$(which treehouses | sed 's/bin\/treehouses//')"lib/node_modules/@treehouses/cli/magazines -type f -printf "%f\n" | grep .sh | sed 's/download-//' | sed 's/.sh//')"
}

complete -F _treehouses_complete treehouses ./cli.sh
