# excluding help
set -l subcommands frequency-info frequency-set idle-info idle-set set info monitor

# disable file completion
complete -fc cpupower

# common switches
complete -c cpupower -s h -l help -d "Show supported commands and general usage"
complete -c cpupower -s c -l cpu -x -a all -d "Only show or set values for specific cores" # im not gonna write completion for the cpu bit mask stuff thingy

# complete subcommands
complete -c cpupower -n "not __fish_seen_subcommand_from $subcommands help" -a help -d "Show manpage for subcommands"
complete -c cpupower -n "not __fish_seen_subcommand_from $subcommands help" -a frequency-info -d "Retrieve cpufreq kernel information"
complete -c cpupower -n "not __fish_seen_subcommand_from $subcommands help" -a frequency-set -d "Modify cpufreq settings"
complete -c cpupower -n "not __fish_seen_subcommand_from $subcommands help" -a idle-info -d "Retrieve cpu idle kernel information"
complete -c cpupower -n "not __fish_seen_subcommand_from $subcommands help" -a idle-set -d "Set cpu idle state specific kernel options"
complete -c cpupower -n "not __fish_seen_subcommand_from $subcommands help" -a set -d "Set processor power related kernel or hardware config"
complete -c cpupower -n "not __fish_seen_subcommand_from $subcommands help" -a info -d "Show processor power related kernel or hardware config"
complete -c cpupower -n "not __fish_seen_subcommand_from $subcommands help" -a monitor -d "Report processor frequency and idle statistics"

# complete other subcommands after 'help', but only once
complete -c cpupower -n "__fish_seen_subcommand_from help && not __fish_seen_subcommand_from $subcommands" -x -a "frequency-info frequency-set idle-info idle-set set info monitor"

complete -c cpupower -n "__fish_seen_subcommand_from frequency-info" -s e -l debug -d "Prints out debug information"
complete -c cpupower -n "__fish_seen_subcommand_from frequency-info" -s f -l freq -d "Get frequency the CPU currently runs at, according to the cpufreq core"
complete -c cpupower -n "__fish_seen_subcommand_from frequency-info" -s w -l hwfreq -d "Get frequency the CPU currently runs at, by reading it from hardware"
complete -c cpupower -n "__fish_seen_subcommand_from frequency-info" -s l -l hwlimits -d "Determine the minimum and maximum CPU frequency allowed"
complete -c cpupower -n "__fish_seen_subcommand_from frequency-info" -s d -l driver -d "Determines the used cpufreq kernel driver"
complete -c cpupower -n "__fish_seen_subcommand_from frequency-info" -s p -l policy -d "Gets the currently used cpufreq policy"
complete -c cpupower -n "__fish_seen_subcommand_from frequency-info" -s g -l governors -d "Determines available cpufreq governors"
complete -c cpupower -n "__fish_seen_subcommand_from frequency-info" -s s -l stats -d "Shows cpufreq statistics if available"
complete -c cpupower -n "__fish_seen_subcommand_from frequency-info" -s y -l latency -d "Determines the maximum latency on CPU frequency changes"
complete -c cpupower -n "__fish_seen_subcommand_from frequency-info" -s o -l proc -d "Prints out information like the old /proc/cpufreq"
complete -c cpupower -n "__fish_seen_subcommand_from frequency-info" -s m -l human -d "human-readable output for the -f, -w, -s and -y parameters"
complete -c cpupower -n "__fish_seen_subcommand_from frequency-info" -s n -l no-rounding -d "Output frequencies and latencies without rounding off values"
# according to the manual, both of these have the short switch '-a', but -a seems to behave as the letter
complete -c cpupower -n "__fish_seen_subcommand_from frequency-info" -l related-cpus -a "Determines which CPUs run at the same hardware frequency"
complete -c cpupower -n "__fish_seen_subcommand_from frequency-info" -s a -l affected-cpus -a "Determines which CPUs need to have their frequency coordinated by software"

complete -c cpupower -n "__fish_seen_subcommand_from frequency-set" -s d -l min -x -d "new minimum CPU frequency the governor may select"
complete -c cpupower -n "__fish_seen_subcommand_from frequency-set" -s u -l max -x -d "new maximum CPU frequency the governor may select"
complete -c cpupower -n "__fish_seen_subcommand_from frequency-set" -s g -l governor -x -a "(string split ' ' < /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors)" -d "new cpufreq governor"
complete -c cpupower -n "__fish_seen_subcommand_from frequency-set" -s f -l freq -x -d "specific frequency to be set. Requires userspace governor to be available and loaded"
complete -c cpupower -n "__fish_seen_subcommand_from frequency-set" -s r -l related -d "modify all hardware-related CPUs at the same time"

complete -c cpupower -n "__fish_seen_subcommand_from idle-info" -s f -l silent -d "Only print a summary of all available C-states in the system"

set -l idlestates (LC_ALL=C cpupower idle-info | string replace -f 'Available idle states: ' '')
complete -c cpupower -n "__fish_seen_subcommand_from idle-set" -s d -l disable -x -a "$idlestates" -d "Disable a specific processor sleep state"
complete -c cpupower -n "__fish_seen_subcommand_from idle-set" -s e -l enable -x -a "$idlestates" -d "Enable a specific processor sleep state"
complete -c cpupower -n "__fish_seen_subcommand_from idle-set" -s D -l disable-by-latency -x -d "Disable all idle states with a equal or higher latency than <LATENCY>"
complete -c cpupower -n "__fish_seen_subcommand_from idle-set" -s E -l enable-all -d "Enable all idle states if not enabled already"

complete -c cpupower -n "__fish_seen_subcommand_from set" -s b -l perf-bias -d "Set relative importance of performance vs energy savings"
complete -c cpupower -n "__fish_seen_subcommand_from info" -s b -l perf-bias -d "Get relative importance of performance vs energy savings"

set -l monitors (LC_ALL=C cpupower monitor -l 2>&1 | awk '$1 == "Monitor" {gsub(/"/, "", $2); print $2} $1 == "Available" {print $3}')
complete -c cpupower -n "__fish_seen_subcommand_from monitor" -s m -x -a "$monitors" -d "Only display this monitor"
complete -c cpupower -n "__fish_seen_subcommand_from monitor" -s v -d "Increase verbosity if the binary was compiled with the DEBUG option set"
complete -c cpupower -n "__fish_seen_subcommand_from monitor" -s c -d "Schedule the process on every core before starting and ending measuring"
complete -c cpupower -n "__fish_seen_subcommand_from monitor" -s i -d "Measure interval"
complete -c cpupower -n "__fish_seen_subcommand_from monitor" -s l -d "List available monitors on your system"
