import { EventEmitter } from 'eventemitter3';
import { VideoWS, VideoWsResult, sleep } from '../src/asr/provider/funasr/ws.ts';
import fs from 'node:fs';
import path from 'node:path';
type BatchSendOptions = {
  vws: VideoWS;
  files: string[];
  matchText?: string;
  emitter?: EventEmitter;
};
export class BatchSendFiles {
  files: string[];
  vws: VideoWS;
  emitter: EventEmitter;
  constructor({ vws, files, emitter }: BatchSendOptions) {
    this.files = files;
    this.vws = vws;
    this.emitter = emitter || vws.emitter;
  }
  async init() {
    const isConnected = await this.vws.isConnected();
    if (!isConnected) {
      console.error('链接失败:', isConnected);
    }
    this.send();
  }
  waitOne() {
    return new Promise((resolve) => {
      this.vws.emitter.once('result', (data) => {
        resolve(data);
      });
    });
  }
  async checkAudioFile(file: string) {
    const stats = fs.statSync(file);
    if (!stats.isFile()) {
      throw new Error(`File not found: ${file}`);
    }
    const ext = path.extname(file).toLowerCase();
    const validExtensions = ['.wav', '.mp3', '.flac', '.ogg', '.aac'];
    if (!validExtensions.includes(ext)) {
      throw new Error(`Invalid file type: ${ext}. Supported types are: ${validExtensions.join(', ')}`);
    }
    const fileSize = stats.size;
    if (fileSize === 0) {
      throw new Error(`File is empty: ${file}`);
    }
    const maxSize = 100 * 1024 * 1024; // 100 MB
    if (fileSize > maxSize) {
      throw new Error(`File size exceeds limit: ${fileSize} bytes. Maximum allowed size is ${maxSize} bytes.`);
    }
    return {
      file,
      ext,
      size: fileSize,
      isValid: true,
    };
  }
  async send() {
    const textList: { file: string; text: string }[] = [];
    for (const file of this.files) {
      let wav_format = 'wav';
      try {
        const ck = await this.checkAudioFile(file);
        if (ck.ext !== '.wav') {
          wav_format = ck.ext.replace('.', '');
        }
      } catch (error) {
        console.error('Error checking file:', error);
        continue;
      }
      const data = fs.readFileSync(file);
      const wait = this.waitOne();
      await this.vws.sendBuffer(data, { wav_format });
      await sleep(1000);
      console.log('File sent:', file);
      const result: VideoWsResult = (await wait) as any;
      console.log('Result:', result.text);
      textList.push({ file, text: result.text });
      console.log('----------------------');
    }
    this.emitter.emit('send-done', textList);
  }
}
// const batchSend = new BatchSendFiles({
//   vws: ws,
//   // files: [audioTestPath],
//   files: [videoTestPath, audioTestPath],
// });
// batchSend.init();
// batchSend.emitter.on('send-done', (data) => {
//   const matchText = '在一无所知中，梦里的一天结束了一个新的轮回，便会开始。';
//   const textList = data as { file: string; text: string }[];
//   for (const item of textList) {
//     const getText = item.text || '';
//     const distance = natural.JaroWinklerDistance(getText, matchText);
//     console.log(`File: ${item.file}, \nText: ${item.text}\nDistance: ${distance}`);
//   }
//   // console.log('Batch processing done:', data);
// });
