import assets from 'url:../../../Assets/Audio/**/*.ogg'

export const audio: Record<string, string> = assets

export let enabled = true
export function enableSound() {
  enabled = true
  if (playingSongAudio) {
    playingSongAudio.play()
  }
}
export function disableSound() {
  enabled = false
  if (playingSongAudio) {
    playingSongAudio.pause()
  }
}

// Preload 'em
for (let [key, value] of (Object.entries(assets) as [string,string][])) {
  let audio = new Audio()
  audio.addEventListener('canplaythrough', () => {
    console.log('preloaded audio', key)
  })
  audio.preload = ''
  audio.src = value
}

let playingSongAudio: HTMLAudioElement
export function playSong(name: string) {
  if (!enabled) return
  // Replace old audio and start crossfading.
  if (playingSongAudio && !playingSongAudio.paused) {
    ;((playingSongAudio: HTMLAudioElement) => {
      let cl = setInterval(() => {
        if (Number(playingSongAudio.volume.toFixed(1)) > 0) {
          playingSongAudio.volume -= 0.1
        } else {
          clearInterval(cl)
        }
      }, 50)
    })(playingSongAudio)
  }
  playingSongAudio = new Audio()
  playingSongAudio.autoplay = true
  playingSongAudio.preload = ''
  playingSongAudio.loop = true
  playingSongAudio.volume = 0
  
  // Start fade in.
  ;((playingSongAudio: HTMLAudioElement) => {
    let cl = setInterval(() => {
      if (playingSongAudio.paused) {
        clearInterval(cl)
        return
      }
      if (Number(playingSongAudio.volume.toFixed(1)) < 1.0) {
        playingSongAudio.volume += 0.1
      } else {
        clearInterval(cl)
      }
    }, 50)
  })(playingSongAudio)

  playingSongAudio.src = audio[name]
  let promise = playingSongAudio.play()
  if (promise !== undefined) {
    promise.then(() => {
      // ok
    }).catch((error: any) => {
      //console.error(error)
    })
  }
}

export function playSound(name: string): HTMLAudioElement {
  let s = new Audio()
  if (!enabled) return s

  s.src = audio[name]
  s.autoplay = true
  s.preload = ''
  ;(async () => {
    await s.play()
  })()

  return s
}