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

with lib;

let

  cfg = config.services.update-from-hydra;

  repositoryOpts = { config, ... }@moduleAttrs: {
    options = {

      enable = mkEnableOption "Make a hydra build output availiable with a symlink and keep it up to date";

      resultPath = mkOption {
        type = types.path;
        description = ''
          Path to the symlink pointing to the hydra build output store path
        '';
      };

      hydraUrl = mkOption {
        type = types.str;
        description = ''
        '';
      };

      hydraProject = mkOption {
        type = types.str;
        description = ''
          Hydra project name
        '';
      };

      hydraJobset = mkOption {
        type = types.str;
        description = ''
          Hydra jobset name
        '';
      };

      hydraJob = mkOption {
        type = types.str;
        description = ''
          Hydra job name
        '';
      };

      buildOutput = mkOption {
        type = with types; nullOr str;
        default = null;
        description = ''
          Build output name
        '';
      };

      nixStoreUri = mkOption {
        type = types.str;
        description = ''
        '';
      };

      startAt = mkOption {
        type = with types; either str (listOf str);
        default = "hourly";
        description = ''
          How often the directory should be updated.
          Formatspecified by `systemd.time 7`.
          This value can also be a list of `systemd.time 7` formatted
          strings, in which case the service will be started on multiple
          schedules.
        '';
      };

    };
  };

in {
  options = {
    services.update-from-hydra = {

      paths = mkOption {
        type = with types; attrsOf (submodule repositoryOpts);
        default = {};
      };

    };
  };

  config = {
    systemd.services = (mapAttrs' (name: path: nameValuePair "update-from-hydra-${name}" (mkIf path.enable {
        inherit (path) startAt;

        wantedBy = [ "multi-user.target" ];

        script = ''
          ${pkgs.update-from-hydra}/bin/update-from-hydra --hydra-url "${path.hydraUrl}" --hydra-project "${path.hydraProject}" --hydra-jobset "${path.hydraJobset}" --hydra-job "${path.hydraJob}" ${optionalString (path.buildOutput != null) "--build-output ${path.buildOutput}"} --nix-store-uri "${path.nixStoreUri}" --gcroot-name "${name}" "${path.resultPath}"
        '';
      })
    ) cfg.paths);
  };
}