#!/bin/bash

set -o nounset
set -o errexit

show_menu() {
    NORMAL=`echo "\033[m"`
    MENU=`echo "\033[36m"`
    NUMBER=`echo "\033[33m"`
    FGRED=`echo "\033[41m"`
    RED_TEXT=`echo "\033[31m"`
    ENTER_LINE=`echo "\033[33m"`

    echo -e ""
    echo -e "${MENU} ${NUMBER} 1)${MENU} Suggest code reviewers based on git history ${NORMAL}"
    echo -e "${MENU} ${NUMBER} 2)${MENU} Detailed stats per author, including contribution to the total change ${NORMAL}"
    echo -e "${MENU} ${NUMBER} 3)${MENU} Git commits per day ${NORMAL}"
    echo -e "${MENU} ${NUMBER} 4)${MENU} Git commits per author ${NORMAL}"
    echo -e "${MENU} ${NUMBER} 5)${MENU} Get own stats for the day ${NORMAL}"
    echo -e "${MENU} ${NUMBER} 6)${MENU} List repository contributors by author name (sorted by name) ${NORMAL}"
    echo -e "${MENU} ${NUMBER} 7)${MENU} List of all the branches, ordered by most recent commits ${NORMAL}"
    echo -e "${MENU} ${NUMBER} 8)${MENU} Generate git changelogs ${NORMAL}"
    echo -e ""
    echo -e "${ENTER_LINE}Please enter a menu option and enter or ${RED_TEXT}enter to exit. ${NORMAL}"
    read opt
}

function option_picked() {
    COLOR='\033[01;31m'
    RESET='\033[00;00m'
    MESSAGE=${@:-"${RESET}Error: No message passed"}
    echo -e "${COLOR}${MESSAGE}${RESET}"
}

function detailedGitStats() {
    git log --numstat | awk '
    function printStats(author) {
      printf "%s:\n", author
      printf "  insertions: %d  (%.0f%%)\n", more[author], (more[author] / more["total"] * 100)
      printf "  deletions: %d  (%.0f%%)\n", less[author], (less[author] / less["total"] * 100)
      printf "  files: %d  (%.0f%%)\n", file[author], (file[author] / file["total"] * 100)
      printf "  commits: %d  (%.0f%%)\n", commits[author], (commits[author] / commits["total"] * 100)
    }

    /^Author:/ {
      author           = $2 " " $3
      commits[author] += 1
      commits["total"]  += 1
    }

    /^[0-9]/ {
      more[author] += $1
      less[author] += $2
      file[author] += 1

      more["total"]  += $1
      less["total"]  += $2
      file["total"]  += 1
    }

    END {
      for (author in commits) {
        if (author != "total") {
          printStats(author)
        }
      }
      printStats("total")
    }'
}

clear
show_menu

while [ opt != '' ]
    do
    if [[ $opt = "" ]]; then
        exit;
    else
        case $opt in
        1)
  	       clear
           option_picked "Suggest code reviewers based on git history:"
           git log --pretty=%an $* | head -n 100 | sort | uniq -c | sort -nr
           show_menu
           ;;

        2)
	       clear
           option_picked "Detailed stats per author, including contribution to the total change:"
           detailedGitStats
           show_menu
           ;;

        3)
	       clear
           option_picked "Git commits per day:";
           git log --date=short --format='%ad' | sort | uniq -c
           show_menu
           ;;

        4)
	       clear
           option_picked "Git commits per author:"
           git shortlog -s -n
	       show_menu
           ;;

        5)
           clear
           option_picked "Get own stats for the day:"
           git diff --shortstat "@{0 day ago}"
           show_menu
           ;;

        6)
           clear
           option_picked "List repository contributors by author name (sorted by name):"
           git log --format='%aN' | sort -u
           show_menu
           ;;

        7)
           clear
           option_picked "List of all the branches, ordered by most recent commits:"
           git for-each-ref --sort=committerdate refs/heads/ --format='[%(authordate:relative)] %(color:blue) %(authorname) %(color:yellow)%(refname:short)%(color:reset)'
           show_menu
           ;;

        8)
           clear
           option_picked "Generate git changelogs:"
           git log --pretty=format:"- %s%n%b" --since="$(git show -s --format=%ad `git rev-list --tags --max-count=1`)"
           show_menu
           ;;

        x)
	       exit
           ;;

        \n)
	       exit
           ;;

        *)
	       clear
           option_picked "Pick an option from the menu"
           show_menu
           ;;

    esac
fi
done