#!/usr/bin/env nu

const ICONS = [
  [ normal charging];
  [ 󰂎 󰢟 ]
  [ 󰁺 󰢜 ]
  [ 󰁻 󰂆 ]
  [ 󰁼 󰂇 ]
  [ 󰁽 󰂈 ]
  [ 󰁾 󰢝 ]
  [ 󰁿 󰂉 ]
  [ 󰂀 󰢞 ]
  [ 󰂁 󰂊 ]
  [ 󰂂 󰂋 ]
  [ 󰁹 󰂅 ]
];

const DELAY = 2sec;

def "main auto" [] {
  loop {
    let paths = ls "/sys/class/power_supply"
      | each {|it| $it.name | path basename}
      | filter {|it| $it starts-with "BAT"};
    
    if ($paths | is-not-empty) {
      let result = $paths
        | each {|it| get_and_format $it}
        | str join " | "
        | prepend "| "
        | str join;

      print $result
    } else {
      print ""
    }
    sleep $DELAY;
  }
}

def main [ path: string ] {
  loop {
    print (get_and_format $path)
    sleep $DELAY;
  }
}

def get_and_format [ path: string ] {
    let fract = get_bat_charge_fraction $path;
    let is_charging = get_bat_charging_status $path;
    let percent = ($fract * 100) | math round;
  
    return $"<span foreground=\"#d65d0e\">(get_bat_icon $fract $is_charging)</span> ($percent)<span foreground=\"#7c6f64\">%</span>";
}

def get_bat_charge_fraction [
  path: string
] {
  let energy_full = open $"/sys/class/power_supply/($path)/energy_full" | into float;
  let energy_now = open $"/sys/class/power_supply/($path)/energy_now" | into float;

  $energy_now / $energy_full
}

def get_bat_charging_status [
  path: string
] {
  let status = open $"/sys/class/power_supply/($path)/status";

  $status like Charging
}

def get_bat_icon [
  frac: float 
  is_charging = false
] {
  $ICONS | get (($frac * 10) | math round) | get (if ($is_charging) { "charging" } else { "normal" })
}
