{ config, pkgs, lib, ... }:
with lib;
let
  luks = config.dadada.luks;
  fido2 = config.dadada.fido2;
in
{

  options = {
    dadada.luks = {
      uuid = mkOption {
        type = with types; nullOr str;
        description = "Device UUID";
        default = null;
      };
    };

    dadada.fido2 = {
      enablePam = mkEnableOption "Enable PAM U2F";
      credential = mkOption {
        type = with types; nullOr str;
        description = "FIDO2 credential string";
        default = null;
      };
    };
  };

  config = {
    boot.initrd.luks.devices = mkIf (luks.uuid != null) {
      root = {
        device = "/dev/disk/by-uuid/${luks.uuid}";
        preLVM = true;
        allowDiscards = true;
        fido2 = mkIf (fido2.credential != null) {
          credential = fido2.credential;
          passwordLess = true;
        };
      };
    };

    boot.initrd.luks.fido2Support = mkIf (fido2.credential != null) true;

    environment.systemPackages = mkIf (fido2.credential != null) (with pkgs; [
      linuxPackages.acpi_call
      fido2luks
      python27Packages.dbus-python
      python38Packages.solo-python
    ]);

    security.pam.u2f = mkIf fido2.enablePam {
      enable = true;
      control = "sufficient";
      cue = true;
    };
  };

}