{ pkgs, lib, ... }:

{
  name = "shiori";
  meta.maintainers = with lib.maintainers; [ minijackson ];

  nodes.machine =
    { ... }:
    {
      services.shiori.enable = true;
    };

  testScript =
    let
      authJSON = pkgs.writeText "auth.json" (
        builtins.toJSON {
          username = "shiori";
          password = "gopher";
          owner = true;
        }
      );

      insertBookmark = {
        url = "http://example.org";
        title = "Example Bookmark";
      };

      insertBookmarkJSON = pkgs.writeText "insertBookmark.json" (builtins.toJSON insertBookmark);
    in
    ''
      #import json

      machine.wait_for_unit("shiori.service")
      machine.wait_for_open_port(8080)
      machine.succeed("curl --fail http://localhost:8080/")
      machine.succeed("curl --fail --location http://localhost:8080/ | grep -i shiori")

      # The test code below no longer works because the API authentication has changed.

      #with subtest("login"):
      #    auth_json = machine.succeed(
      #        "curl --fail --location http://localhost:8080/api/login "
      #        "-X POST -H 'Content-Type:application/json' -d @${authJSON}"
      #    )
      #    auth_ret = json.loads(auth_json)
      #    session_id = auth_ret["session"]

      #with subtest("bookmarks"):
      #    with subtest("first use no bookmarks"):
      #        bookmarks_json = machine.succeed(
      #            (
      #                "curl --fail --location http://localhost:8080/api/bookmarks "
      #                "-H 'X-Session-Id:{}'"
      #            ).format(session_id)
      #        )

      #        if json.loads(bookmarks_json)["bookmarks"] != []:
      #            raise Exception("Shiori have a bookmark on first use")

      #    with subtest("insert bookmark"):
      #        machine.succeed(
      #            (
      #                "curl --fail --location http://localhost:8080/api/bookmarks "
      #                "-X POST -H 'X-Session-Id:{}' "
      #                "-H 'Content-Type:application/json' -d @${insertBookmarkJSON}"
      #            ).format(session_id)
      #        )

      #    with subtest("get inserted bookmark"):
      #        bookmarks_json = machine.succeed(
      #            (
      #                "curl --fail --location http://localhost:8080/api/bookmarks "
      #                "-H 'X-Session-Id:{}'"
      #            ).format(session_id)
      #        )

      #        bookmarks = json.loads(bookmarks_json)["bookmarks"]
      #        if len(bookmarks) != 1:
      #            raise Exception("Shiori didn't save the bookmark")

      #        bookmark = bookmarks[0]
      #        if (
      #            bookmark["url"] != "${insertBookmark.url}"
      #            or bookmark["title"] != "${insertBookmark.title}"
      #        ):
      #            raise Exception("Inserted bookmark doesn't have same URL or title")
    '';
}
