{ config, lib, pkgs, ... }:
# https://github.com/michalrus/dotfiles/blob/d943be3089aa436e07cea5f22d829402936a9229/.nixos-config.symlink/modules/sane-extra-config.nix
# via https://github.com/NixOS/nixpkgs/issues/17411
# via  https://unix.stackexchange.com/questions/321954/install-epson-v39-on-nixos
with lib;

let

  cfg = config.hardware.sane;

  pkg = if cfg.snapshot
    then pkgs.sane-backends-git
    else pkgs.sane-backends;

  backends = [ pkg ] ++ cfg.extraBackends;

  saneConfig = pkgs.mkSaneConfig { paths = backends; };

  saneExtraConfig = pkgs.runCommand "sane-extra-config" {} ''
    cp -Lr '${pkgs.mkSaneConfig { paths = [ pkgs.sane-backends ]; }}'/etc/sane.d $out
    chmod +w $out
    ${concatMapStrings (c: ''
      f="$out/${c.name}.conf"
      [ ! -e "$f" ] || chmod +w "$f"
      cat ${builtins.toFile "" (c.value + "\n")} >>"$f"
      chmod -w "$f"
    '') (mapAttrsToList nameValuePair cfg.extraConfig)}
    chmod -w $out
  '';

in

{
  options = {
    hardware.sane.extraConfig = mkOption {
      type = types.attrsOf types.lines;
      default = {};
      example = { "some-backend" = "# some lines to add to its .conf"; };
    };
  };

  config = mkIf (cfg.enable && cfg.extraConfig != {}) {
    hardware.sane.configDir = saneExtraConfig.outPath;
  };
}