import type { ParallelTaskExecuteContext } from '../../handler'

import { ParallelHandler } from '../../handler'

class DecodeData extends ParallelHandler<string, AudioBuffer> {
  private audioContext: AudioContext = new AudioContext()

  /**
   * 执行音频解码任务
   * @param context - 并行任务执行上下文
   */
  public execute(
    context: ParallelTaskExecuteContext<string, AudioBuffer>,
  ): void {
    if (context.isLastExecute) {
      this.taskCompletedCallback(context.taskItem.uuid)
      return
    }
    if (!context.taskItem.original) {
      this.taskCompletedCallback(context.taskItem.uuid)
      return
    }

    fetch(context.taskItem.original)
      .then((response) => {
        return response.arrayBuffer()
      })
      .then((arrayBuffer) => {
        this.audioContext.decodeAudioData(
          arrayBuffer,
          (audioData) => {
            this.forwardToHandler(audioData)
            this.taskCompletedCallback(context.taskItem.uuid)
          },
          (error) => {
            console.error('音频解码失败:', error)
            this.executeController?.$bus.emit('_appError', error)
            this.taskCompletedCallback(context.taskItem.uuid)
          },
        )
      })
      .catch((error) => {
        console.error('获取音频数据失败:', error)
        this.executeController?.$bus.emit('_appError', error)
        this.taskCompletedCallback(context.taskItem.uuid)
      })
  }

  protected onFinish(): void {
    if (this.audioContext) {
      this.audioContext.suspend()
      this.audioContext.close()
    }
    this.executeController?.$bus.emit('_decodeDataFinish')
  }
}

export default DecodeData
