{ lib, config, options, pkgs, modulesPath, ... }:
with lib;
let
  cfg = config.yoda.de-p1st-monitor;

  my-python-packages = ps: with ps; [
    # de-p1st-monitor is not (yet) packaged, thus we build it from PyPI
    (
      buildPythonPackage rec {
        pname = "de.p1st.monitor";
        # Important: When updating the version number, adjust the Git revision below accordingly!
        version = "0.13.0";
        # https://nixos.wiki/wiki/Packaging/Python#Fix_Missing_setup.py
        format = "pyproject";
        src = builtins.fetchGit {
          url = "https://codeberg.org/privacy1st/de-p1st-monitor";
          rev = "7c57eba12a512a3a4fe72c2d5cbfa80cebdbd3bd";
        };
        propagatedBuildInputs = [
          # Dependencies
          pkgs.python3Packages.psutil
          # Build dependencies
          setuptools
          build
          twine
        ];
      }
    )
  ];
in
{
  options = {
    yoda.de-p1st-monitor = mkOption {
      type = types.str;
      example = ''
        [logging]
        dir = /var/log/de-p1st-monitor/
        [network.1]
        network_interface = wlan0
      '';
      description = ''
        Content of /etc/de-p1st-monitor/''${hostname}.ini
      '';
    };
  };

  config = {
    # Install de.p1st.monitor packages.
    environment.systemPackages = [
      (pkgs.python3.withPackages my-python-packages)
      # Dependency of de.p1st.monitor.
      pkgs.smartmontools
    ];
    # Dependency of de.p1st.monitor
    boot.kernelModules = [ "drivetemp" ];

    # Create configuration file.
    environment.etc."de-p1st-monitor/${config.networking.hostName}.ini".text = cfg;

    # Create de.p1st.monitor timer.
    systemd.timers."de.p1st.monitor" = {
      wantedBy = [ "timers.target" ];
      partOf = [ "de.p1st.monitor.service" ];
      timerConfig = {
        OnBootSec = "0m";
        OnUnitInactiveSec = "3m";

        AccuracySec = "15s";
        RandomizedDelaySec = "15s";
      };
    };
    systemd.services."de.p1st.monitor" = {
      serviceConfig = {
        Type = "oneshot";
        PrivateTmp = true;
        # `smartctl` requires root to access /dev/* devices and read their temperatures.
        User = "root";
        Nice = 19;
        IOSchedulingClass = "idle";
        ExecStart = "${pkgs.python3.withPackages my-python-packages}/bin/de-p1st-monitor";
      };
      path = with pkgs; [
        # Provides `findmnt` binary.
        libuuid
        smartmontools
      ];
    };
  };
}
