import config from "config";

import MysqlConnectionManager from "../src/db/MysqlConnectionManager.js";
import TestApp from "../src/TestApp.js";
import {setupMailServer, teardownMailServer} from "./_mail_server.js";


export default function useApp<T extends TestApp>(appSupplier: AppSupplier<T>): () => T {
    let app: T;

    beforeAll(async (done) => {
        await MysqlConnectionManager.prepare();
        await MysqlConnectionManager.query('DROP DATABASE IF EXISTS ' + config.get<string>('mysql.database'));
        await MysqlConnectionManager.endPool();

        await setupMailServer();
        app = await appSupplier('127.0.0.1', 8966);

        await app.start();
        done();
    });

    afterAll(async (done) => {
        const errors = [];

        try {
            await app.stop();
        } catch (e) {
            errors.push(e);
        }

        try {
            await teardownMailServer();
        } catch (e) {
            errors.push(e);
        }

        if (errors.length > 0) throw errors;
        done();
    });

    return () => app;
}

export type AppSupplier<T extends TestApp> = (addr: string, port: number) => Promise<T>;