import {connection} from '@models/api'
import {PriorityCalculator, priorityLog} from '@models/trafficControl/PriorityCalculator'
import {connectionInfo} from '@stores/index'
import {participantsStore} from '@stores/participants'
import JitsiMeetJS from 'lib-jitsi-meet'
import _ from 'lodash'
import {autorun} from 'mobx'
declare const d:any                  //  from index.html

export const priorityCalculator = new PriorityCalculator()
d.priorityCalculator = priorityCalculator

const recalculateInterval = 1000
let intervalHandle: number | undefined = undefined


autorun(() => {
  const state = connectionInfo.state

  if (state === 'connected') {
    priorityCalculator.enable()
    intervalHandle = window.setInterval(
      memoedUpdater,
      recalculateInterval,
    )
  } else if (state === 'disconnected') {
    priorityCalculator.disable()
    if (intervalHandle !== undefined) {
      clearInterval(intervalHandle)
    }
  }
})
autorun(() => {
  const local = participantsStore.local
  priorityCalculator.setLimits([local.remoteVideoLimit, local.remoteAudioLimit])
})
// let interval:NodeJS.Timeout|undefined = undefined
const memoedUpdater = (() => {
  let memo: any = undefined

  return () => {
    priorityCalculator.update()
    const newList = [priorityCalculator.lastContentVideos,
      priorityCalculator.lastParticipantVideos, priorityCalculator.lastAudios]
    if (!_.isEqual(newList, memo)) {
      // Send res to Jitsi bridge
      const perceptibles:JitsiMeetJS.BMPerceptibles = {
        audibles: priorityCalculator.lastAudios,
        visibleContents: priorityCalculator.lastContentVideos,
        visibleParticipants: priorityCalculator.lastParticipantVideos,
      }
      connection.conference.setPerceptibles(perceptibles)
      priorityLog('setPerceptibles:', newList)
      //console.log(`setPerceptibles:${JSON.stringify(res)}`)
      memo = _.cloneDeep(newList)
    }
  }
})()