import { INestApplication } from "@nestjs/common";
import { Test, TestingModuleBuilder } from "@nestjs/testing";
import { config as loadDotenv } from "dotenv";
import { resolve } from "node:path";
import { applyAppMiddleware } from "../../src/app.bootstrap";
import { AppModule } from "../../src/app.module";
import { ProviderRouterService } from "../../src/providers/provider-router.service";
import { FakeProviderRouterService } from "./fake-provider-router";

loadDotenv({ path: resolve(__dirname, "../../.env.test"), override: true });

export interface TestAppHandle {
  app: INestApplication;
  fakeRouter: FakeProviderRouterService;
  close: () => Promise<void>;
}

export async function buildTestApp(): Promise<TestAppHandle> {
  const fakeRouter = new FakeProviderRouterService();

  const builder: TestingModuleBuilder = Test.createTestingModule({
    imports: [AppModule],
  })
    .overrideProvider(ProviderRouterService)
    .useValue(fakeRouter);

  const moduleRef = await builder.compile();
  const app = moduleRef.createNestApplication({ rawBody: true });
  applyAppMiddleware(app);
  await app.init();

  return {
    app,
    fakeRouter,
    close: async () => {
      await app.close();
    },
  };
}
