#! /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 [ARGS]     Checks current TDP and prints it in watts
  set WATTS [ARGS] 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
  ${command_name} c -d

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

set_help_text="${command_name} set WATT [ARGUMENTS]

Example:
  ${command_name} set 10 --detail
  ${command_name} s 10 -d

Arguments:
  --detail, -d     Prints PL2 as well as PL1
  --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 [[ "$@" == *"--detail"* ]] || [[ "$@" == *"-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
    echo "Please specify wattage"
    exit
  elif [ "$1" == "--help" ]; then
    print_help "set"
    exit
  elif ! [[ $1 =~ ^-?[0-9]+$ ]]; then
    echo "TDP is not a number or argument unknown!)"
    print_unknown
    exit
  fi

  if [ $1 -lt 5 ] || [ $1 -gt 30 ]; then
    echo "TDP too high or low, should be between 5W and 30W"
    echo "This is a sanity limit to prevent you from throttling to a near unusable state"
  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)"
    if [[ "$@" == *"--detail"* ]] || [[ "$@" == *"-d"* ]]; then
      echo "PL2 is now ${watts2}W (Short-term)"
    fi
  fi
}

# Command handler
case $1 in

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

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

  "help")
    print_help
    ;;

  *)
    print_unknown
    ;;
esac