import { get } from 'svelte/store'
import {
  isCameraEnabled,
  isConnected,
  $isCurrentInstanceConnected,
  isMicEnabled,
  isSharingEnabled,
  setCam,
  setMic,
  setShare
} from './utils'
import { getCurrentLocation, location } from '@hcengineering/ui'

let key = 'love' + getCurrentLocation().path?.[2]

let bc: BroadcastChannel | undefined

location.subscribe((newLocation) => {
  if (newLocation.path?.[2] !== undefined && 'BroadcastChannel' in window) {
    const newKey = 'love' + newLocation.path[2]
    if (key !== newKey) {
      key = newKey
      bc = new BroadcastChannel(key)
    }
  }
})

type BroadcastMessage =
  | BroadcastConnectMessage
  | BroadcastChangeHostMessage
  | BroadcastStatusAskMessage
  | BroadcastSetMessage
  | BroadcastStatusMessage

interface BroadcastConnectMessage {
  type: 'connect'
  value: boolean
}

interface BroadcastChangeHostMessage {
  type: 'change_host'
}

interface BroadcastStatusAskMessage {
  type: 'status_ask'
}

interface BroadcastSetMessage {
  type: 'set_mic' | 'set_cam' | 'set_share'
  value: boolean
}

interface BroadcastStatusMessage {
  type: 'mic' | 'cam' | 'share'
  value: boolean
}

export function sendMessage (req: BroadcastMessage): void {
  bc?.postMessage(req)
}

if (bc !== undefined) {
  bc.onmessage = async (e: MessageEvent<BroadcastMessage>) => {
    if (e.data.type === 'set_mic') {
      if ($isCurrentInstanceConnected) {
        await setMic(e.data.value)
      }
    }
    if (e.data.type === 'set_cam') {
      if ($isCurrentInstanceConnected) {
        await setCam(e.data.value)
      }
    }
    if (e.data.type === 'set_share') {
      if ($isCurrentInstanceConnected) {
        await setShare(e.data.value)
      }
    }
    if (e.data.type === 'share') {
      isSharingEnabled.set(e.data.value)
    }
    if (e.data.type === 'mic') {
      isMicEnabled.set(e.data.value)
    }
    if (e.data.type === 'cam') {
      isCameraEnabled.set(e.data.value)
    }
    if (e.data.type === 'status_ask') {
      if ($isCurrentInstanceConnected) {
        sendMessage({ type: 'connect', value: true })
        sendMessage({ type: 'mic', value: get(isMicEnabled) })
        sendMessage({ type: 'cam', value: get(isCameraEnabled) })
        sendMessage({ type: 'share', value: get(isSharingEnabled) })
      }
    }
    if (e.data.type === 'connect') {
      if (!$isCurrentInstanceConnected) {
        isConnected.set(e.data.value)
      }
    }
  }
}

sendMessage({ type: 'status_ask' })