'use strict'

import { ENVIRONMENT_TYPE_POPUP, PLATFORM_BRAVE, PLATFORM_FIREFOX } from '../../app/scripts/lib/enums'
import { getEnvironmentType, getPlatform } from '../../app/scripts/lib/util'

class WebcamUtils {

  static async checkStatus () {
    const isPopup = getEnvironmentType() === ENVIRONMENT_TYPE_POPUP
    const isFirefoxOrBrave = getPlatform() === (PLATFORM_FIREFOX || PLATFORM_BRAVE)

    const devices = await window.navigator.mediaDevices.enumerateDevices()
    const webcams = devices.filter((device) => device.kind === 'videoinput')
    const hasWebcam = webcams.length > 0
    // A non-empty-string label implies that the webcam has been granted permission, as
    // otherwise the label is kept blank to prevent fingerprinting
    const hasWebcamPermissions = webcams.some((webcam) => webcam.label && webcam.label.length > 0)

    if (hasWebcam) {
      let environmentReady = true
      if ((isFirefoxOrBrave && isPopup) || (isPopup && !hasWebcamPermissions)) {
        environmentReady = false
      }
      return {
        permissions: hasWebcamPermissions,
        environmentReady,
      }
    } else {
      const error = new Error('No webcam found')
      error.type = 'NO_WEBCAM_FOUND'
      throw error
    }
  }
}

export default WebcamUtils