{ lib, ... }:

{
  name = "xandikos";

  meta.maintainers = with lib.maintainers; [ _0x4A6F ];

  nodes = {
    xandikos_client = { };
    xandikos_default = {
      networking.firewall.allowedTCPPorts = [ 8080 ];
      services.xandikos.enable = true;
    };
    xandikos_proxy = {
      networking.firewall.allowedTCPPorts = [
        80
        8080
      ];
      services.xandikos.enable = true;
      services.xandikos.address = "localhost";
      services.xandikos.port = 8080;
      services.xandikos.routePrefix = "/xandikos-prefix/";
      services.xandikos.extraOptions = [
        "--defaults"
      ];
      services.nginx = {
        enable = true;
        recommendedProxySettings = true;
        virtualHosts."xandikos" = {
          serverName = "xandikos.local";
          basicAuth.xandikos = "snakeOilPassword";
          locations."/xandikos/" = {
            proxyPass = "http://localhost:8080/xandikos-prefix/";
          };
        };
      };
    };
  };

  testScript = ''
    start_all()

    with subtest("Xandikos default"):
        xandikos_default.wait_for_unit("multi-user.target")
        xandikos_default.wait_for_unit("xandikos.service")
        xandikos_default.wait_for_open_port(8080)
        xandikos_default.succeed("curl --fail http://localhost:8080/")
        xandikos_default.succeed(
            "curl -s --fail --location http://localhost:8080/ | grep -i Xandikos"
        )
        xandikos_client.wait_for_unit("network.target")
        xandikos_client.fail("curl --fail http://xandikos_default:8080/")

    with subtest("Xandikos proxy"):
        xandikos_proxy.wait_for_unit("multi-user.target")
        xandikos_proxy.wait_for_unit("xandikos.service")
        xandikos_proxy.wait_for_open_port(8080)
        xandikos_proxy.succeed("curl --fail http://localhost:8080/")
        xandikos_proxy.succeed(
            "curl -s --fail --location http://localhost:8080/ | grep -i Xandikos"
        )
        xandikos_client.wait_for_unit("network.target")
        xandikos_client.fail("curl --fail http://xandikos_proxy:8080/")
        xandikos_client.succeed(
            "curl -s --fail -u xandikos:snakeOilPassword -H 'Host: xandikos.local' http://xandikos_proxy/xandikos/ | grep -i Xandikos"
        )
        xandikos_client.succeed(
            "curl -s --fail -u xandikos:snakeOilPassword -H 'Host: xandikos.local' http://xandikos_proxy/xandikos/user/ | grep -i Xandikos"
        )
  '';
}
