import ../../make-test-python.nix (
  { lib, pkgs, ... }:

  let
    movim = {
      domain = "movim.local";
      info = "No ToS in tests";
      description = "NixOS testing server";
    };
    xmpp = {
      domain = "xmpp.local";
      admin = rec {
        JID = "${username}@${xmpp.domain}";
        username = "romeo";
        password = "juliet";
      };
    };
  in
  {
    name = "movim-standard";

    meta = {
      maintainers = with pkgs.lib.maintainers; [ toastal ];
    };

    nodes = {
      server =
        { pkgs, ... }:
        {
          services.movim = {
            inherit (movim) domain;
            enable = true;
            verbose = true;
            podConfig = {
              inherit (movim) description info;
              xmppdomain = xmpp.domain;
            };
            nginx = { };
          };

          services.prosody = {
            enable = true;
            xmppComplianceSuite = false;
            disco_items = [
              {
                url = "upload.${xmpp.domain}";
                description = "File Uploads";
              }
            ];
            virtualHosts."${xmpp.domain}" = {
              inherit (xmpp) domain;
              enabled = true;
              extraConfig = ''
                Component "pubsub.${xmpp.domain}" "pubsub"
                    pubsub_max_items = 10000
                    expose_publisher = true

                Component "upload.${xmpp.domain}" "http_file_share"
                    http_external_url = "http://upload.${xmpp.domain}"
                    http_file_share_expires_after = 300 * 24 * 60 * 60
                    http_file_share_size_limit = 1024 * 1024 * 1024
                    http_file_share_daily_quota = 4 * 1024 * 1024 * 1024
              '';
            };
            extraConfig = ''
              pep_max_items = 10000

              http_paths = {
                  file_share = "/";
              }
            '';
          };

          networking.extraHosts = ''
            127.0.0.1 ${movim.domain}
            127.0.0.1 ${xmpp.domain}
          '';
        };
    };

    testScript = # python
      ''
        server.wait_for_unit("phpfpm-movim.service")
        server.wait_for_unit("nginx.service")
        server.wait_for_open_port(80)

        server.wait_for_unit("prosody.service")
        server.succeed('prosodyctl status | grep "Prosody is running"')
        server.succeed("prosodyctl register ${xmpp.admin.username} ${xmpp.domain} ${xmpp.admin.password}")

        server.wait_for_unit("movim.service")

        # Test unauthenticated
        server.fail("curl -L --fail-with-body --max-redirs 0 http://${movim.domain}/chat")

        # Test basic Websocket
        server.succeed("echo \"\" | ${lib.getExe pkgs.websocat} 'ws://${movim.domain}/ws/?path=login&offset=0' --origin 'http://${movim.domain}'")

        # Test login + create cookiejar
        login_html = server.succeed("curl --fail-with-body -c /tmp/cookies http://${movim.domain}/login")
        assert "${movim.description}" in login_html
        assert "${movim.info}" in login_html

        # Test authentication POST
        server.succeed("curl --fail-with-body -b /tmp/cookies -X POST --data-urlencode 'username=${xmpp.admin.JID}' --data-urlencode 'password=${xmpp.admin.password}' http://${movim.domain}/login")

        server.succeed("curl -L --fail-with-body --max-redirs 1 -b /tmp/cookies http://${movim.domain}/chat")
      '';
  }
)