{ pkgs, ... }:
let
  creds = pkgs.writeText ".monetdb" ''
    user=monetdb
    password=monetdb
  '';
  createUser = pkgs.writeText "createUser.sql" ''
    CREATE USER "voc" WITH PASSWORD 'voc' NAME 'VOC Explorer' SCHEMA "sys";
    CREATE SCHEMA "voc" AUTHORIZATION "voc";
    ALTER USER "voc" SET SCHEMA "voc";
  '';
  credsVoc = pkgs.writeText ".monetdb" ''
    user=voc
    password=voc
  '';
  transaction = pkgs.writeText "transaction" ''
    START TRANSACTION;
    CREATE TABLE test (id int, data varchar(30));
    ROLLBACK;
  '';
  vocData = pkgs.fetchzip {
    url = "https://dev.monetdb.org/Assets/VOC/voc_dump.zip";
    hash = "sha256-sQ5acTsSAiXQfOgt2PhN7X7Z9TZGZtLrPPxgQT2pCGQ=";
  };
  onboardPeople = pkgs.writeText "onboardPeople" ''
    CREATE VIEW onboard_people AS
    SELECT * FROM (
    SELECT 'craftsmen' AS type, craftsmen.* FROM craftsmen
    UNION ALL
    SELECT 'impotenten' AS type, impotenten.* FROM impotenten
    UNION ALL
    SELECT 'passengers' AS type, passengers.* FROM passengers
    UNION ALL
    SELECT 'seafarers' AS type, seafarers.* FROM seafarers
    UNION ALL
    SELECT 'soldiers' AS type, soldiers.* FROM soldiers
    UNION ALL
    SELECT 'total' AS type, total.* FROM total
    ) AS onboard_people_table;
    SELECT type, COUNT(*) AS total
    FROM onboard_people GROUP BY type ORDER BY type;
  '';
  onboardExpected = pkgs.lib.strings.replaceStrings [ "\n" ] [ "\\n" ] ''
    +------------+-------+
    | type       | total |
    +============+=======+
    | craftsmen  |  2349 |
    | impotenten |   938 |
    | passengers |  2813 |
    | seafarers  |  4468 |
    | soldiers   |  4177 |
    | total      |  2467 |
    +------------+-------+
  '';
in
{
  name = "monetdb";
  meta = with pkgs.lib.maintainers; {
    maintainers = [ StillerHarpo ];
  };
  nodes.machine.services.monetdb.enable = true;
  testScript = ''
    machine.start()
    machine.wait_for_unit("monetdb")
    machine.succeed("monetdbd create mydbfarm")
    machine.succeed("monetdbd start mydbfarm")
    machine.succeed("monetdb create voc")
    machine.succeed("monetdb release voc")
    machine.succeed("cp ${creds} ./.monetdb")
    assert "hello world" in machine.succeed("mclient -d voc -s \"SELECT 'hello world'\"")
    machine.succeed("mclient -d voc ${createUser}")
    machine.succeed("cp ${credsVoc} ./.monetdb")
    machine.succeed("mclient -d voc ${transaction}")
    machine.succeed("mclient -d voc ${vocData}/voc_dump.sql")
    assert "8131" in machine.succeed("mclient -d voc -s \"SELECT count(*) FROM voyages\"")
    assert "${onboardExpected}" in machine.succeed("mclient -d voc ${onboardPeople}")

  '';
}
