import {
  ConnectError,
  mapConnectErrorToHttpStatus,
} from "@mochabug/adapt-sdk/api";
import {
  ExternalExecutorRouter,
  CronExecutorRouter
} from '@mochabug/adapt-sdk/router';

export default {
  external: new ExternalExecutorRouter()
    .useRequestLogging()
    .useBearerAuthorization(['/api'])
    .useErrorHandling(async (e) => {
      console.error(e);
      if (e instanceof ConnectError) {
        return new Response(null, { status: mapConnectErrorToHttpStatus(e) });
      }
      return new Response(null, {
        status: 500,
        statusText: 'Internal server error'
      });
    })
    .add('POST', '/api/done', async (req, api, _route, ctx) => {
      const sapi = api.getSessionApi(req.headers.get('Authorization')!);
      ctx.waitUntil(sapi.send('output', {}));
      return new Response();
    })
    .add('GET', '{/*any}', async (_, api) => {
      const res = await api.readFile(
        'browser/___VERTEX_NAME___/executor.html'
      );
      return new Response(res.content, {
        headers: { 'Content-Type': 'text/html; charset=utf-8' }
      });
    }),
  internal: new CronExecutorRouter()
      .onStart(async (start, _api) => {
        console.log('Start has been called');
        console.log(start);
      })
      .onStop(async (stop, _api) => {
        console.log('Stop has been called');
        console.log(stop);
      })
      .onExchange(async (res, _api, name) => {
        console.log(`Exchange ${name} has been called`);
        console.log(res);
      })
      .onCron(async (cron, api, ctx) => {
        console.log('Received cron event');
        ctx.waitUntil(api.send('output', {}));
        console.log(cron);
      })
};
