import axios from 'axios';
import { Device } from 'mediasoup-client';
import { DtlsParameters } from 'mediasoup-client/lib/Transport';

export async function connectServerTransport(
  sendTransport,
  dtlsParameters: DtlsParameters,
  apiToken: string,
  apiUrl: string,
) {
  console.log('client: connecting send transport');
  await axios
    .post(`${apiUrl}/transports/${sendTransport.id}/connect`, {
      dtlsParameters,
      apiToken,
    })
    .catch((e) => {
      console.error('client: error connecting transport', e);
      throw e;
    });
  console.log('client: connected');
}

export async function createTransport(
  device: Device,
  type: 'send' | 'recv',
  apiUrl: string,
  apiToken: string,
) {
  const respTransport = await axios
    .post(`${apiUrl}/transports`, {
      sctpCapabilities: device.sctpCapabilities,
      apiToken,
    })
    .catch((e) => {
      console.error('client: error creating transport', e);
      throw e;
    });
  const transportInfo = respTransport.data;
  if (!transportInfo) {
    throw new Error('client: transport info is not defined');
  }

  const {
    id,
    iceParameters,
    iceCandidates,
    dtlsParameters,
    sctpParameters,
    iceServers,
  } = transportInfo;

  console.log('client: creating send transport on device');

  const transportOptions = {
    id,
    iceParameters,
    iceCandidates,
    dtlsParameters,
    sctpParameters,
    iceServers,
  };

  const transport =
    type === 'send'
      ? device.createSendTransport(transportOptions)
      : device.createRecvTransport(transportOptions);

  transport.on('connectionstatechange', async (state) => {
    console.log(`client: ${type} transport connection state`, state);
    if (state === 'connected') {
      console.log('client: connected');
    }
  });
  transport?.on(
    'connect',
    async (data: { dtlsParameters: DtlsParameters }, callback, errback) => {
      console.log(`client: connected ${type} transport`);
      connectServerTransport(transport, data.dtlsParameters, apiToken, apiUrl)
        .then(callback)
        .catch(errback);
    },
  );
  console.log(`client: created ${type} transport on device`);
  return transport;
}
