#! /usr/bin/bash

# Set up help text
command_name=$(basename $0)
help_text="${command_name}: GDP Win 3 TDP management script

This script checks and sets the TDP using intel_rapl

Usage:
  ${command_name} COMMAND [ARGUMENTS]

Command:
  check [ARG]      Checks current TDP and prints it in watts
  set WATT         Setts TDP to the requested number in watts
  help             Prints this help text
  COMMAND help     Prints help for specified command"

check_help_text="${command_name} check [ARG]

Example:
  ${command_name} check --detail

Arguments:
  --detail, -d     Prints PL2 as well as PL1
  --help           Prints this help text"

set_help_text="${command_name} set WATT

Example:
  ${command_name} set 15

Arguments:
  --help           Prints this help text"

print_help () {
  case $1 in
    "check")
      echo "$check_help_text"
      ;;
    "set")
      echo "$set_help_text"
      ;;
    *)
      echo "$help_text"
      ;;
  esac
}

print_unknown () {
  echo "Unknown command or incorrect arguments.
  Try \"${command_name} help\" or \"${command_name} COMMAND --help\""
}
# End of help text

# Retrieves current TDP and prints it
check_tdp () {
  if [ "$1" == "--detail" ] || [ "$1" == "-d" ]; then
      echo "Placeholder"
      echo "Extra placeholder"

  elif [ -z "$1" ]; then
      echo "Placeholder"

  elif [ "$1" == "--help" ]; then
    print_help "check"

  else
    print_unknown
  fi
}

# Sets TDP to number provided as first argument
set_tdp () {
  if [ -z "$1" ]; then
    print_unknown
    exit
  elif [ "$1" == "--help" ]; then
    print_help "set"
    exit
  fi

  if ! [[ $1 =~ ^-?[0-9]+$ ]]; then
    echo "TDP must be a plain number!)"
  elif [[ ! "$@" == *"--force"* ]] || [ $1 -lt 8 ] || [ $1 -gt 28 ]; then
    echo "TDP too high or low, should be between 8W and 28W"
  else
    #PL1
    local watts=$1
    local uwatts=$(expr $watts '*' 1000000)

    #PL2
    local watts2=$(expr $watts + 2)
    local uwatts2=$(expr $watts2 '*' 1000000)

    echo $uwatts
    echo "PL1 is now ${watts}W (Long-term)"
    echo "PL2 is now ${watts2}W (Short-term)"
  fi
}

# Command handler
case $1 in

  "check")
    check_tdp "${@:2}"
    ;;

  "set")
    set_tdp "${@:2}"
    ;;

  "help")
    print_help
    ;;

  *)
    print_unknown
    ;;
esac