# bash programmable completion for _networksetup
# Tony Willianms (honestpuck@gmail.com)
# v1.0 2020-03-25
# v1.1 2020-03-26 Add hardware ports and device names

_networksetup() {
    local cur prev opts opts_ns
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"

    # all the options (gulp!)
    opts="-listnetworkserviceorder -listallnetworkservices -listallhardwareports \
        -detectnewhardware -getmacaddress -getcomputername -setcomputername \
        -getinfo -setmanual -setdhcp -setbootp -setmanualwithdhcprouter \
        -getadditionalroutes -setadditionalroutes -setv4off -setv6off \
        -setv6automatic -setv6LinkLocal -setv6manual -getv6additionalroutes \
        -setv6additionalroutes  -getdnsservers -setdnsservers  -getsearchdomains \
        -setsearchdomains -create6to4service -set6to4automatic -set6to4manual \
        -getftpproxy -setftpproxy -setftpproxystate -getwebproxy -setwebproxy \
        -setwebproxystate -getsecurewebproxy -setsecurewebproxy \
        -setsecurewebproxystate -getstreamingproxy -setstreamingproxy \
        -setstreamingproxystate -getgopherproxy -setgopherproxy \
        -setgopherproxystate -getsocksfirewallproxy -setsocksfirewallproxy \
        -setsocksfirewallproxystate -getproxybypassdomains -setproxybypassdomains \
        -getproxyautodiscovery -setproxyautodiscovery -getpassiveftp \
        -setpassiveftp -getairportnetwork -setairportnetwork -getairportpower \
        -setairportpower -listpreferredwirelessnetworks \
        -addpreferredwirelessnetworkatindex -removepreferredwirelessnetwork \
        -removeallpreferredwirelessnetworks -getnetworkserviceenabled \
        -setnetworkserviceenabled -createnetworkservice -renamenetworkservice \
        -duplicatenetworkservice -removenetworkservice -ordernetworkservices \
        -getMTU -setMTU -listvalidMTUrange -getmedia -setmedia -listvalidmedia \
        -createVLAN -deleteVLAN -listVLANs -listdevicesthatsupportVLAN \
        -isBondSupported -createBond -deleteBond -addDeviceToBond \
        -removeDeviceFromBond -listBonds -showBondStatus -listpppoeservices \
        -showpppoestatus -createpppoeservice -deletepppoeservice \
        -setpppoeaccountname -setpppoepassword -connectpppoeservice \
        -disconnectpppoeservice -getcurrentlocation -listlocations -createlocation \
        -deletelocation -switchtolocation -listalluserprofiles -listloginprofiles \
        -enablesystemprofile -enableloginprofile -enableuserprofile \
        -import8021xProfiles -export8021xProfiles -export8021xUserProfiles \
        -export8021xLoginProfiles -export8021xSystemProfile \
        -settlsidentityonsystemprofile -settlsidentityonuserprofile \
        -deleteloginprofile -deleteuserprofile -version -help -printcommands"

    # options that want a device name after the option
    dev_opts="getairportnetwork setairportnetwork getairportpower setairportpower \
        listpreferredwirelessnetworks addpreferredwirelessnetworkatindex \
        removepreferredwirelessnetwork removeallpreferredwirelessnetworks"

    # handle the device name
    if [[ $(echo $dev_opts | grep -c "${prev:1}" ) -eq 1 ]] ; then
        dev_names=$(networksetup -listallhardwareports  | grep "Device" | cut -f 2 -d ' ')
        COMPREPLY=($(compgen -W "$dev_names" - "$cur"))
        return
    fi

    case "$cur" in
    -*)
        COMPREPLY=($(compgen -W "$opts" - "$cur"))
        return
        ;;
    '"'*)
        # handle service name - that's a double quote to start
        COMPREPLY=()
        while read service; do
            COMPREPLY+=("$service")
        done < <(networksetup -listallnetworkservices | grep -v "asterisk" | tr -d '*')
        return
        ;;
    \'*)
        # handle hardware port - that's a single quote to start
        COMPREPLY=()
        while read port; do
            COMPREPLY+=("$port")
        done < <(networksetup -listallhardwareports | egrep "Hardware" | sed 's#^.*:\ ##')
        return
        ;;
    esac
}

complete -o bashdefault -o default -F _networksetup networksetup
