import type { ParallelTaskExecuteContext } from '../../handler'

import { ParallelHandler } from '../../handler'

class DecodeData extends ParallelHandler<Blob, AudioBuffer> {
  private audioContext: AudioContext = new AudioContext()

  public execute(
    context: ParallelTaskExecuteContext<Blob, AudioBuffer>,
  ): void {
    if (context.isLastExecute) {
      this.taskCompletedCallback(context.taskItem.uuid)
      return
    }

    const reader = new FileReader()

    reader.readAsArrayBuffer(new Blob([context.taskItem.original!]))
    reader.onload = (event) => {
      const arrayBuffer = event.target?.result as ArrayBuffer
      if (!arrayBuffer) {
        this.taskCompletedCallback(context.taskItem.uuid)
        return
      }

      this.audioContext.decodeAudioData(arrayBuffer, (audioBuffer) => {
        this.forwardToHandler(audioBuffer)
        this.taskCompletedCallback(context.taskItem.uuid)
      })
    }
  }

  protected onFinish(): void {
    if (this.audioContext) {
      this.audioContext.suspend()
      this.audioContext = new AudioContext()
    }
    this.executeController?.$bus.emit('_decodeDataFinish')
  }
}

export default DecodeData
