#!/bin/bash
# Original Author: Alexander Epstein https://github.com/alexanderepstein

currentVersion="1.10.0"
configuredClient=""
search="0"
insensitive=""
recursive=""
boundry=""

## This function determines which http get tool the system has installed and returns an error if there isnt one
getConfiguredClient()
{
  if  command -v curl &>/dev/null ; then
    configuredClient="curl"
  elif command -v wget &>/dev/null ; then
    configuredClient="wget"
  elif command -v fetch &>/dev/null ; then
    configuredClient="fetch"
  else
    echo "Error: This tool reqires either curl, wget, or fetch to be installed."
    return 1
  fi

}

## Allows to call the users configured client without if statements everywhere
httpGet()
{
  case "$configuredClient" in
    curl) curl -A curl -s "$@";;
    wget) wget -qO- "$@";;
    fetch) fetch -o "...";;
  esac
}


checkInternet()
{
  echo -e "GET http://google.com HTTP/1.0\n\n" | nc google.com 80 > /dev/null 2>&1 # query google with a get request
  if [ $? -eq 0 ]; then #check if the output is 0, if so no errors have occured and we have connected to google successfully
    return 0
  else
    echo "Error: no active internet connection" >&2 #sent to stderr
    return 1
  fi
}


usage()
{
  echo "Cheat tool"
  echo "Usage: cheat [flags] [command] or cheat [flags] [programming language] [subject]"
  echo "  -s Does a search for last argument rather than looking for exact match"
  echo "  -i Case insensitive search"
  echo "  -b Word boundaries in search"
  echo "  -r Recursive search"
  echo "  -h Show the help"
  echo "  -v Get the tool version"
  echo "Special Pages:"
  echo "  hello Describes building the hello world program written in the language"
  echo "  list This lists all cheatsheets related to previous arg if none it lists all cheatsheets"
  echo "  learn Shows a learn-x-in-minutes language cheat sheet perfect for getting started with the language"
  echo "  1line A collection of one-liners in this language"
  echo "  weirdness A collection of examples of weird things in this language"
}

getCheatSheet()
{
  if [[ $# == 1 ]]; then
    if [[ $search == "1" ]];then
      link=cheat.sh/~$1
    else
      link=cheat.sh/$1
    fi
  else
    link=cheat.sh/$1
  fi

  if [[ $# == 2 ]];then
    if [[ $search == "1" ]];then
      link+=/~$2
    else
      link+=/$2
    fi
  fi

  if [[ $insensitive != "" || $recursive != "" || $boundry != "" ]];then link+=/$boundry$insensitive$recursive; fi

  httpGet $link
}

checkSpecialPage()
{
  temp=$1
  if [[ $1 == "list" ]];then
    temp=":list"
  elif [[ $1 == "learn" ]];then
    temp=":list"
  elif [[ $1 == "styles" ]];then
    temp=":styles"
  fi
  if [[ $2 == "1" ]];then
    arg1=$temp
  else
    arg2=$temp
  fi
}

getConfiguredClient || exit 1
#checkInternet || exit 1

while getopts "ribuvhis" opt; do
  case $opt in
    \?)
      echo "Invalid option: -$OPTARG" >&2
      exit 1
    ;;
    h)
      usage
      exit 0
    ;;
    v)
      echo "Version $currentVersion"
      exit 0
    ;;
    i)
      insensitive="i"
      search="1"
    ;;
    b)
      boundry="b"
      search="1"
    ;;
    r)
      recursive="r"
      search="1"
    ;;
    s)
      search="1"
    ;;
    :)
      echo "Option -$OPTARG requires an argument." >&2
      exit 1
    ;;
  esac
done

for arg
do
  if [[ $arg != "-r" && $arg != "-s" && $arg != "-b" && $arg != "-i" ]];then
    if [ -z ${arg1+x} ];then
      arg1=$arg
    fi
    if [ ! -z ${arg1+x} ];then
      arg2=$arg
    fi
  fi
done

checkSpecialPage $arg1 1
checkSpecialPage $arg2 2

if [[ $# == 0 ]]; then
  usage
  exit 0
elif [[ $1 == "help" || $1 == ":help" ]];then
  usage
  exit 0
else
  if [[ $arg1 != $arg2 ]];then
    getCheatSheet $arg1 $arg2
  else
    getCheatSheet $arg1
  fi
  exit 0

fi
