import {memo, useEffect} from 'react';
import {AMPLITUDE_EVENTS} from '@shared/constants';
import {logAmplitudeEvent} from '@shared/utils/logs';
import {sentryLogs} from '@shared/utils/logs/sentryLogs';

import {useCallObserver} from '../../hooks';
import {CallService} from '../../utils';

import type {NativeCallObserverEventPayload} from '../../interfaces';

const logCallObserverAmplitude = (
  event: string,
  payload: NativeCallObserverEventPayload,
) => {
  logAmplitudeEvent(event, {
    callId: payload.id,
    providerCallId: payload.providerCallId,
    type: payload.type,
    format: payload.format,
    direction: payload.direction,
    caller: payload.caller,
    callee: payload.callee,
    participant: payload.participant,
    participantUserIds: payload.participantUserIds,
    ended: payload.ended,
    endSource: payload.endSource,
    endReason: payload.endReason,
    endedByUserId: payload.endedByUserId,
    ringing: payload.ringing,
  });
};

const logCallObserverSentry = (
  event: string,
  payload: NativeCallObserverEventPayload,
) => {
  sentryLogs.info({
    message: `Call observer event: ${event}`,
    module: 'CALLS',
    component: 'CallObserver',
    data: {
      event,
      callId: payload.id,
      providerCallId: payload.providerCallId,
      type: payload.type,
      format: payload.format,
      direction: payload.direction,
      caller: payload.caller,
      callee: payload.callee,
      participant: payload.participant,
      participantUserIds: payload.participantUserIds,
      ended: payload.ended,
      endSource: payload.endSource,
      endReason: payload.endReason,
      endedByUserId: payload.endedByUserId,
      ringing: payload.ringing,
    },
  });
};

const logCallObserverEvent = (
  event: string,
  payload: NativeCallObserverEventPayload,
) => {
  logCallObserverAmplitude(event, payload);
  logCallObserverSentry(event, payload);
};

function CallObserverComponent() {
  useCallObserver({
    CALLS_MOBILE_CALL_STARTED: payload => {
      logCallObserverEvent(AMPLITUDE_EVENTS.CALLS_MOBILE_CALL_STARTED, payload);
    },
    CALLS_MOBILE_CALL_ACCEPTED: payload => {
      logCallObserverEvent(
        AMPLITUDE_EVENTS.CALLS_MOBILE_CALL_ACCEPTED,
        payload,
      );
    },
    CALLS_MOBILE_CALL_REJECTED: payload => {
      logCallObserverEvent(
        AMPLITUDE_EVENTS.CALLS_MOBILE_CALL_REJECTED,
        payload,
      );
    },
    CALLS_MOBILE_CALL_PARTICIPANT_JOINED: payload => {
      logCallObserverEvent(
        AMPLITUDE_EVENTS.CALLS_MOBILE_CALL_PARTICIPANT_JOINED,
        payload,
      );
    },
    CALLS_MOBILE_CALL_ENDED: payload => {
      logCallObserverEvent(AMPLITUDE_EVENTS.CALLS_MOBILE_CALL_ENDED, payload);
    },
    CALLS_MOBILE_CALL_RINGING: payload => {
      logCallObserverEvent(AMPLITUDE_EVENTS.CALLS_MOBILE_CALL_RINGING, payload);
    },
  });

  useEffect(() => {
    CallService.init();
  }, []);

  return null;
}

export const CallObserver = memo(CallObserverComponent);
