import { Qenv } from '@push.rocks/qenv';
const testQenv = new Qenv('./', './.nogit/');

import * as cloudly from '../../ts/index.js';

const stopFunctions: Array<() => Promise<void>> = [];

const tapToolsNodeMod = await import('@push.rocks/tapbundle/node');
const smartmongo = await tapToolsNodeMod.tapNodeTools.createSmartmongo();
stopFunctions.push(async () => {
  await smartmongo.stopAndDumpToDir('./.nogit/mongodump');
});
const smarts3 = await tapToolsNodeMod.tapNodeTools.createSmarts3();
await smarts3.createBucket('cloudly-test');
stopFunctions.push(async () => {
  await smarts3.stop();
});

export const testCloudlyConfig: cloudly.ICloudlyConfig = {
  cfToken: await testQenv.getEnvVarOnDemand('CF_TOKEN'),
  environment: 'integration',
  letsEncryptEmail: 'test@serve.zone',
  publicUrl: '127.0.0.1',
  publicPort: '8080',
  mongoDescriptor: await smartmongo.getMongoDescriptor(),
  s3Descriptor: await smarts3.getS3Descriptor(),
  sslMode: 'none',
  ...(() => {
    if (process.env.NPMCI_SECRET01) {
      return {
        hetznerToken: process.env.NPMCI_SECRET01,
      };
    }
  })(),
};

await tapToolsNodeMod.tapNodeTools.testFileProvider.getDockerAlpineImageAsLocalTarball();

export const createCloudly = async () => {
  const cloudlyInstance = new cloudly.Cloudly(testCloudlyConfig);
  return cloudlyInstance;
};

export const stopCloudly = async () => {
  await Promise.all(stopFunctions.map((stopFunction) => stopFunction()));
};

export const getEnvVarOnDemand = async (envVarName: string) => {
  return testQenv.getEnvVarOnDemand(envVarName);
};