{ config, lib, pkgs, ... }:

with lib;

let
  cfg = config.clerie.akne;

in {
  options = {
    clerie.akne = {
      enable = mkEnableOption "Makes fun stuff with the nixos acme module.";
      selfSignedOnlyHostNames = mkOption {
        type = with types; listOf str;
        default = [];
        description = "List of hostnames for which the acme client gets disabled. This hostnames use the self-signed certs instead.";
      };
    };
  };

  config = {
    systemd.services = with lib; listToAttrs (
      flatten (
        map (
          name: [
            (
              nameValuePair "acme-${name}" {
                enable = false;
                wantedBy = mkForce [];
              }
            )
            (
              nameValuePair "acme-selfsigned-${name}" {
                wantedBy = [ "multi-user.target" ];
              }
            )
          ]
        ) cfg.selfSignedOnlyHostNames
      )
    );
    systemd.targets = with lib; listToAttrs (
      flatten (
        map (
          name: [
            (
              nameValuePair "acme-finished-${name}" {
                after = mkForce [ "acme-selfsigned-${name}.service" ];
                requires = mkForce [ "acme-selfsigned-${name}.service" ];
              }
            )
          ]
        ) cfg.selfSignedOnlyHostNames
      )
    );
  };
}