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

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

	script = pkgs.writeShellScriptBin "powerlimit" (util.trimTabs ''
		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 = lib.mkEnableOption "the powerlimit service";
		onMin = lib.mkOption {
			default = 40;
			type    = lib.types.int;
		};
		onMax = lib.mkOption {
			default = 80;
			type    = lib.types.int;
		};
		offMin = lib.mkOption {
			default = 90;
			type    = lib.types.int;
		};
		offMax = lib.mkOption {
			default = 95;
			type    = lib.types.int;
		};
	};

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