import ./make-test-python.nix (
  { pkgs, ... }:
  {
    name = "caddy";
    meta = with pkgs.lib.maintainers; {
      maintainers = [ Br1ght0ne ];
    };

    nodes = {
      webserver =
        { pkgs, lib, ... }:
        {
          services.caddy.enable = true;
          services.caddy.extraConfig = ''
            http://localhost {
              encode gzip

              file_server
              root * ${
                pkgs.runCommand "testdir" { } ''
                  mkdir "$out"
                  echo hello world > "$out/example.html"
                ''
              }
            }
          '';
          services.caddy.enableReload = true;

          specialisation.config-reload.configuration = {
            services.caddy.extraConfig = ''
              http://localhost:8080 {
              }
            '';
          };
          specialisation.multiple-configs.configuration = {
            services.caddy.virtualHosts = {
              "http://localhost:8080" = { };
              "http://localhost:8081" = { };
            };
          };
          specialisation.rfc42.configuration = {
            services.caddy.settings = {
              apps.http.servers.default = {
                listen = [ ":80" ];
                routes = [
                  {
                    handle = [
                      {
                        body = "hello world";
                        handler = "static_response";
                        status_code = 200;
                      }
                    ];
                  }
                ];
              };
            };
          };
          specialisation.explicit-config-file.configuration = {
            services.caddy.configFile = pkgs.writeText "Caddyfile" ''
              localhost:80

              respond "hello world"
            '';
          };
        };
    };

    testScript =
      { nodes, ... }:
      let
        explicitConfigFile = "${nodes.webserver.system.build.toplevel}/specialisation/explicit-config-file";
        justReloadSystem = "${nodes.webserver.system.build.toplevel}/specialisation/config-reload";
        multipleConfigs = "${nodes.webserver.system.build.toplevel}/specialisation/multiple-configs";
        rfc42Config = "${nodes.webserver.system.build.toplevel}/specialisation/rfc42";
      in
      ''
        url = "http://localhost/example.html"
        webserver.wait_for_unit("caddy")
        webserver.wait_for_open_port(80)


        with subtest("config is reloaded on nixos-rebuild switch"):
            webserver.succeed(
                "${justReloadSystem}/bin/switch-to-configuration test >&2"
            )
            webserver.wait_for_open_port(8080)
            webserver.fail("journalctl -u caddy | grep -q -i stopped")
            webserver.succeed("journalctl -u caddy | grep -q -i reloaded")

        with subtest("multiple configs are correctly merged"):
            webserver.succeed(
                "${multipleConfigs}/bin/switch-to-configuration test >&2"
            )
            webserver.wait_for_open_port(8080)
            webserver.wait_for_open_port(8081)

        with subtest("rfc42 settings config"):
            webserver.succeed(
                "${rfc42Config}/bin/switch-to-configuration test >&2"
            )
            webserver.wait_for_open_port(80)
            webserver.succeed("curl http://localhost | grep hello")

        with subtest("explicit configFile"):
            webserver.succeed(
                "${explicitConfigFile}/bin/switch-to-configuration test >&2"
            )
            webserver.wait_for_open_port(80)
            webserver.succeed("curl http://localhost | grep hello")
      '';
  }
)