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

with lib;

let
  cfg = config.hacc.websites;
in

{
  options.hacc.websites = {
    enable = mkOption {
      type = types.bool;
      default = false;
    };
    directory = mkOption {
      type = types.path;
      description = "all subdirectories of the given path are expected to contain a (static) website";
    };
    ignore = mkOption {
      type = types.listOf types.str;
      default = [];
      description = "subdirectories that shouldn't be published";
    };
  };

  config = mkIf cfg.enable {
    services.nginx = {
      enable = true;
      virtualHosts =
        let
          subdirs =
            let dirAttrs = filterAttrs
              (n: v: v == "directory" || lists.elem n cfg.ignore)
              (builtins.readDir cfg.directory);
            in mapAttrsToList (n: v: n) dirAttrs;

          mkWebsite = subdir: {
            name = subdir;
            # the nginx virtualhost config (for all sites) goes in here
            value = {
              enableACME = true;
              forceSSL = true;

              # naive string interpolation is safe here since nix will always immediately
              # resolve relative paths to absolute paths; it's not lazy about that.
              locations."/".root =
                (pkgs.callPackage "${cfg.directory}/${subdir}" {}).outPath;
            };
          };
        in listToAttrs (map mkWebsite subdirs);
    };
  };
}
