import fs from 'fs';
import path from 'path';
import { exec } from 'child_process';
import { promisify } from 'util';
import { VoiceParams } from '../../types';

const execAsync = promisify(exec);

// 模拟 TTS Provider
// 使用 FFmpeg 生成静音或简单音调作为占位音频
export class MockTtsProvider {
  // 语音合成（模拟）
  async synthesize(
    text: string,
    voiceId: string,
    params: VoiceParams,
    outputPath: string
  ): Promise<string> {
    try {
      // 计算预估时长（按语速调整）
      // 正常语速约 4 字/秒
      const baseDuration = Math.ceil(text.length / 4);
      const duration = Math.ceil(baseDuration / params.speed);

      // 确保目录存在
      const dir = path.dirname(outputPath);
      if (!fs.existsSync(dir)) {
        fs.mkdirSync(dir, { recursive: true });
      }

      // 使用 FFmpeg 生成简单的正弦波音频作为占位
      // 这是一个模拟音频，实际项目中应调用真实 TTS API
      const frequency = params.pitch >= 0 ? 440 + params.pitch : 440;
      const cmd = `ffmpeg -f lavfi -i "sine=frequency=${frequency}:duration=${duration}" -y "${outputPath}"`;

      await execAsync(cmd, { timeout: 30000 });
      console.log(`✅ 模拟 TTS 生成成功: ${outputPath} (时长: ${duration}s)`);

      return outputPath;
    } catch (error) {
      console.error('❌ 模拟 TTS 生成失败:', error);

      // 如果 FFmpeg 不可用，创建一个空文件作为备用
      const dir = path.dirname(outputPath);
      if (!fs.existsSync(dir)) {
        fs.mkdirSync(dir, { recursive: true });
      }

      // 创建一个最小的 MP3 文件头
      const minimalMp3 = Buffer.from([
        0xff, 0xfb, 0x90, 0x00, // MP3 帧头
        0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00,
      ]);
      fs.writeFileSync(outputPath, minimalMp3);
      console.log(`⚠️ 创建占位音频文件: ${outputPath}`);

      return outputPath;
    }
  }
}