import { TrackType } from '../../gen/video/sfu/models/models';
import { TrackMuteType } from '../../types';
import { ensureExhausted } from '../../helpers/ensureExhausted';

export const trackTypeToParticipantStreamKey = (
  trackType: TrackType,
):
  | 'audioStream'
  | 'videoStream'
  | 'screenShareStream'
  | 'screenShareAudioStream'
  | undefined => {
  switch (trackType) {
    case TrackType.SCREEN_SHARE:
      return 'screenShareStream';
    case TrackType.SCREEN_SHARE_AUDIO:
      return 'screenShareAudioStream';
    case TrackType.VIDEO:
      return 'videoStream';
    case TrackType.AUDIO:
      return 'audioStream';
    case TrackType.UNSPECIFIED:
      throw new Error('Track type is unspecified');
    default:
      ensureExhausted(trackType, 'Unknown track type');
  }
};

export const muteTypeToTrackType = (
  muteType: TrackMuteType,
): TrackType | undefined => {
  switch (muteType) {
    case 'audio':
      return TrackType.AUDIO;
    case 'video':
      return TrackType.VIDEO;
    case 'screenshare':
      return TrackType.SCREEN_SHARE;
    case 'screenshare_audio':
      return TrackType.SCREEN_SHARE_AUDIO;
    default:
      ensureExhausted(muteType, 'Unknown mute type');
  }
};

export const toTrackType = (trackType: string): TrackType | undefined => {
  switch (trackType) {
    case 'TRACK_TYPE_AUDIO':
      return TrackType.AUDIO;
    case 'TRACK_TYPE_VIDEO':
      return TrackType.VIDEO;
    case 'TRACK_TYPE_SCREEN_SHARE':
      return TrackType.SCREEN_SHARE;
    case 'TRACK_TYPE_SCREEN_SHARE_AUDIO':
      return TrackType.SCREEN_SHARE_AUDIO;
    default:
      return undefined;
  }
};

export const isAudioTrackType = (trackType: TrackType): boolean =>
  trackType === TrackType.AUDIO || trackType === TrackType.SCREEN_SHARE_AUDIO;
