# ThinkPad charge limits.
{
  pkgs,
  lib,
  config,
  ...
}@args:
with lib;
let
  cfg = config.module.powerlimit.thinkpad;

  controlFileMin = "/sys/class/power_supply/BAT0/charge_control_start_threshold";
  controlFileMax = "/sys/class/power_supply/BAT0/charge_control_end_threshold";

  script = pkgs.writeShellScriptBin "powerlimit" ''
    function toggle() {
      if status; then
        echo ${toString cfg.offMax} > ${controlFileMax}
        echo ${toString cfg.offMin} > ${controlFileMin}
      else
        echo ${toString cfg.onMin} > ${controlFileMin}
        echo ${toString cfg.onMax} > ${controlFileMax}
      fi

      pkill -RTMIN+6 waybar
      true
    }

    function widget() {
      status && printf '​' || printf ''
    }

    function status() {
      local current=$(cat ${controlFileMax})
      local enabled="${toString cfg.onMax}"

      [[ "''${current}" = "''${enabled}" ]]
    }

    ''${@}
  '';
in
{
  options = {
    module.powerlimit.thinkpad = {
      enable = mkEnableOption "Powerlimit Service";
      onMin = mkOption {
        default = 40;
        type = types.int;
      };
      onMax = mkOption {
        default = 80;
        type = types.int;
      };
      offMin = mkOption {
        default = 90;
        type = types.int;
      };
      offMax = mkOption {
        default = 95;
        type = types.int;
      };
    };
  };

  config = mkIf cfg.enable {
    environment.systemPackages = [ script ];
    systemd = {
      services.powerlimit = {
        description = "Limit battery charge.";
        enable = true;
        wantedBy = [ "multi-user.target" ];
        serviceConfig = {
          Type = "simple";
          RemainAfterExit = "yes";
          ExecStart = "${getExe pkgs.bash} -c 'echo ${toString cfg.onMin} > ${controlFileMin}; echo ${toString cfg.onMax} > ${controlFileMax};'";
          ExecStop = "${getExe pkgs.bash} -c 'echo ${toString cfg.offMax} > ${controlFileMax}; echo ${toString cfg.offMin} > ${controlFileMin};'";
        };
      };

      # HACK: Allow user access.
      tmpfiles.rules = [
        "z ${controlFileMax} 0777 - - - -"
        "z ${controlFileMin} 0777 - - - -"
      ];
    };
  };
}