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

  let
    db-pass = "Test2Test2";
    app-key = "TestTestTestTestTestTestTestTest";
  in
  {
    name = "firefly-iii";
    meta.maintainers = [ lib.maintainers.savyajha ];

    nodes.fireflySqlite =
      { config, ... }:
      {
        environment.etc = {
          "firefly-iii-appkey".text = app-key;
        };
        services.firefly-iii = {
          enable = true;
          enableNginx = true;
          settings = {
            APP_KEY_FILE = "/etc/firefly-iii-appkey";
            LOG_CHANNEL = "stdout";
            SITE_OWNER = "mail@example.com";
          };
        };
      };

    nodes.fireflyPostgresql =
      { config, pkgs, ... }:
      {
        environment.etc = {
          "firefly-iii-appkey".text = app-key;
          "postgres-pass".text = db-pass;
        };
        services.firefly-iii = {
          enable = true;
          enableNginx = true;
          settings = {
            APP_KEY_FILE = "/etc/firefly-iii-appkey";
            LOG_CHANNEL = "stdout";
            SITE_OWNER = "mail@example.com";
            DB_CONNECTION = "pgsql";
            DB_DATABASE = "firefly";
            DB_USERNAME = "firefly";
            DB_PASSWORD_FILE = "/etc/postgres-pass";
            PGSQL_SCHEMA = "firefly";
          };
        };

        services.postgresql = {
          enable = true;
          package = pkgs.postgresql_16;
          authentication = ''
            local all postgres peer
            local firefly firefly password
          '';
          initialScript = pkgs.writeText "firefly-init.sql" ''
            CREATE USER "firefly" WITH LOGIN PASSWORD '${db-pass}';
            CREATE DATABASE "firefly" WITH OWNER "firefly";
            \c firefly
            CREATE SCHEMA AUTHORIZATION firefly;
          '';
        };
      };

    nodes.fireflyMysql =
      { config, pkgs, ... }:
      {
        environment.etc = {
          "firefly-iii-appkey".text = app-key;
          "mysql-pass".text = db-pass;
        };
        services.firefly-iii = {
          enable = true;
          enableNginx = true;
          settings = {
            APP_KEY_FILE = "/etc/firefly-iii-appkey";
            LOG_CHANNEL = "stdout";
            SITE_OWNER = "mail@example.com";
            DB_CONNECTION = "mysql";
            DB_DATABASE = "firefly";
            DB_USERNAME = "firefly";
            DB_PASSWORD_FILE = "/etc/mysql-pass";
            DB_SOCKET = "/run/mysqld/mysqld.sock";
          };
        };

        services.mysql = {
          enable = true;
          package = pkgs.mariadb;
          initialScript = pkgs.writeText "firefly-init.sql" ''
            create database firefly DEFAULT CHARACTER SET utf8mb4;
            create user 'firefly'@'localhost' identified by '${db-pass}';
            grant all on firefly.* to 'firefly'@'localhost';
          '';
          settings.mysqld.character-set-server = "utf8mb4";
        };
      };

    testScript = ''
      fireflySqlite.wait_for_unit("phpfpm-firefly-iii.service")
      fireflySqlite.wait_for_unit("nginx.service")
      fireflySqlite.succeed("curl -fvvv -Ls http://localhost/ | grep 'Firefly III'")
      fireflySqlite.succeed("curl -fvvv -Ls http://localhost/v1/js/app.js")
      fireflySqlite.succeed("systemctl start firefly-iii-cron.service")
      fireflyPostgresql.wait_for_unit("phpfpm-firefly-iii.service")
      fireflyPostgresql.wait_for_unit("nginx.service")
      fireflyPostgresql.wait_for_unit("postgresql.service")
      fireflyPostgresql.succeed("curl -fvvv -Ls http://localhost/ | grep 'Firefly III'")
      fireflyPostgresql.succeed("systemctl start firefly-iii-cron.service")
      fireflyMysql.wait_for_unit("phpfpm-firefly-iii.service")
      fireflyMysql.wait_for_unit("nginx.service")
      fireflyMysql.wait_for_unit("mysql.service")
      fireflyMysql.succeed("curl -fvvv -Ls http://localhost/ | grep 'Firefly III'")
      fireflyMysql.succeed("systemctl start firefly-iii-cron.service")
    '';
  }
)