#!/usr/bin/env bash
#  batterybar; displays battery percentage as a bar on i3blocks
#
#  Copyright 2015 Keftaa <adnan.37h@gmail.com>
#
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public License
#  along with this program; if not, write to the Free Software
#  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
#  MA 02110-1301, USA.
#
#
readarray -t output <<< $(acpi battery)
battery_count=${#output[@]}

for line in "${output[@]}";
do
    percentages+=($(echo "$line" | grep -o -m1 '[0-9]\{1,3\}%' | tr -d '%'))
    statuses+=($(echo "$line" | egrep -o -m1 'Discharging|Charging|AC|Full|Unknown'))
    remaining=$(echo "$line" | egrep -o -m1 '[0-9][0-9]:[0-9][0-9]')
    if [[ -n $remaining ]]; then
        remainings+=(" ($remaining)")
    else
        remainings+=("")
    fi
done

squares="■"

#There are 8 colors that reflect the current battery percentage when
#discharging
dis_colors=(
   "${C1:-#FF0000}"
   "${C2:-#FF6666}"
   "${C2:-#FF9999}"
   "${C4:-#FFAAAA}"
   "${C5:-#AAAAAA}"
   "${C6:-#AAAAAA}"
   "${C7:-#AAAAAA}"
   "${C8:-#AAAAAA}"
)
charging_color="${CHARGING_COLOR:-#6699CC}"
full_color="${FULL_COLOR:-#CCCCCC}"
ac_color="${AC_COLOR:-#535353}"


while getopts 1:2:3:4:5:6:7:8:c:f:a:h opt; do
    case "$opt" in
        1) dis_colors[0]="$OPTARG";;
        2) dis_colors[1]="$OPTARG";;
        3) dis_colors[2]="$OPTARG";;
        4) dis_colors[3]="$OPTARG";;
        5) dis_colors[4]="$OPTARG";;
        6) dis_colors[5]="$OPTARG";;
        7) dis_colors[6]="$OPTARG";;
        8) dis_colors[7]="$OPTARG";;
        c) charging_color="$OPTARG";;
        f) full_color="$OPTARG";;
        a) ac_color="$OPTARG";;
        h) printf "Usage: batterybar [OPTION] color
        When discharging, there are 8 [1-8] levels colors.
        You can specify custom colors, for example:

        batterybar -1 red -2 \"#F6F6F6\" -8 green

        You can also specify the colors for the charging, AC and
        charged states:

        batterybar -c green -f white -a \"#EEEEEE\"\n";
        exit 0;
    esac
done

end=$(($battery_count - 1))
for i in $(seq 0 $end);
do
    if (( percentages[$i] > 0 && percentages[$i] < 10  )); then
        squares="□□□□□"
    elif (( percentages[$i] >= 10 && percentages[$i] < 20 )); then
        squares="■□□□□"
    elif (( percentages[$i] >= 20 && percentages[$i] < 40 )); then
        squares="■■□□□"
    elif (( percentages[$i] >= 40 && percentages[$i] < 60 )); then
        squares="■■■□□"
    elif (( percentages[$i] >= 60 && percentages[$i] < 80 )); then
        squares="■■■■□"
    elif (( percentages[$i] >= 80 )); then
        squares="■■■■■"
    fi

    if [[ "${statuses[$i]}" = "Unknown" ]]; then
        squares="<sup>?</sup>$squares"
    fi

    color=${ac_color}

    case "${statuses[$i]}" in
    "Charging")
        color="$charging_color"
    ;;
    "Full")
        color="$full_color"
    ;;
    "AC")
        color="$ac_color"
    ;;
    "Discharging"|"Unknown")
        if (( percentages[$i] >= 0 && percentages[$i] < 10 )); then
            color="${dis_colors[0]}"
        elif (( percentages[$i] >= 10 && percentages[$i] < 20 )); then
            color="${dis_colors[1]}"
        elif (( percentages[$i] >= 20 && percentages[$i] < 30 )); then
            color="${dis_colors[2]}"
        elif (( percentages[$i] >= 30 && percentages[$i] < 40 )); then
            color="${dis_colors[3]}"
        elif (( percentages[$i] >= 40 && percentages[$i] < 60 )); then
            color="${dis_colors[4]}"
        elif (( percentages[$i] >= 60 && percentages[$i] < 70 )); then
            color="${dis_colors[5]}"
        elif (( percentages[$i] >= 70 && percentages[$i] < 80 )); then
            color="${dis_colors[6]}"
        elif (( percentages[$i] >= 80 )); then
            color="${dis_colors[7]}"
        fi
    ;;
    esac

    # Print Battery number if there is more than one
    if (( $end > 0 )) ; then
        message="$message $(($i + 1)):"
    fi

    if [[ "$BLOCK_BUTTON" -eq 1 ]]; then
        message="$message ${statuses[$i]} ${percentages[$i]}%${remainings[i]}"
    fi
        message="$message <span foreground=\"$color\">$squares</span>"
done

echo $message