#!/usr/bin/env bash
###################
# dependencies:
# - bash
# - sudo
# - nmcli
###################

# interface name defaults to wlp2s0, may want to set to 'wlan0':
IFACE="${IFACE:-wlp2s0}"

# dependency check
for i in sudo nmcli; do
  if ! command -v "$i" >/dev/null 2>&1; then
    echo "ERROR: $i is not installed."
    exit 1
  fi
done  

# if ran without arguments
if [[ $# -eq 0 ]]; then
  sudo nmcli dev wifi list
  exit $?
fi

usage() {
  echo "
wificonnect <-s SSID -p PASSWORD <-i INTERFACE> <-H|--hidden> >

Options:

-s | --ssid SSID
-p | --pass PASSWORD
-i | --interface IFACE (default: wlp2s0)
-H | --hidden (default: false)

If run without parameters, wificonnect will list details about the wifi networks currently available.
Parameters can also be set using environment variables and passing dummy arguments.
"
  exit 1
}


# parse arguments:
parse_args() {
  while [[ "$#" -gt 0 ]]; do
    case $1 in
      -s|--ssid) SSID="${SSID:-$2}"; shift; shift ;;
      -p|--pass) PASS="${PASS:-$2}"; shift; shift ;;
      -i|--interface) IFACE="${IFACE:-$2}"; shift; shift ;;
      -H|--hidden) HIDDEN=1; shift ;;
      *) usage; shift; shift ;;
    esac
  done
}

# can run with 'wificonnect [ssid] [password]', otherwise parse args:
if [[ "$#" -eq "2" ]]; then
  SSID="${SSID:-$1}"
  PASS="${PASS:-$2}"
else
  parse_args ${@}
fi

# rescan for new APs:
sudo nmcli dev wifi rescan >/dev/null 2>&1
sudo nmcli dev wifi rescan >/dev/null 2>&1

# make sure wifi is on:
if sudo nmcli radio wifi | grep -q disabled; then
  sudo nmcli radio wifi on
fi

if [[ -z "$HIDDEN" ]]; then
  echo $IFACE
  sudo nmcli dev wifi connect "${SSID}" password "${PASS}"
  exit $?
fi

# if new hidden network:
sudo nmcli c add type wifi con-name "$SSID" ifname "$IFACE" ssid "$SSID"
sudo nmcli con modify "$SSID" wifi-sec.key-mgmt wpa-psk
sudo nmcli con modify "$SSID" wifi-sec.psk "$PASS"
sudo nmcli con up "$SSID"
exit $?
