package com.ruoyi.aicall.utils;

import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.Base64;

public class PcmToWavConverter {

    /**
     * 将Base64编码的PCM数据转换为标准WAV文件
     * @param base64String PCM数据的Base64编码
     * @param outputPath 输出WAV文件路径
     * @param sampleRate 采样率（如16000）
     * @param channels 声道数（1=单声道，2=立体声）
     * @param bitsPerSample 位深（如16）
     */
    public static void convertPcmToWav(String base64String, String outputPath,
                                       int sampleRate, int channels, int bitsPerSample) throws IOException {

        // Step 1: 解码PCM数据
        byte[] pcmData = Base64.getDecoder().decode(base64String);

        // Step 2: 计算WAV头参数
        int byteRate = sampleRate * channels * bitsPerSample / 8;
        int blockAlign = channels * bitsPerSample / 8;
        int dataSize = pcmData.length;
        int totalSize = 36 + dataSize;

        // Step 3: 构建WAV头部（44字节）
        ByteBuffer header = ByteBuffer.allocate(44);
        header.order(ByteOrder.LITTLE_ENDIAN);

        // RIFF Chunk
        header.put("RIFF".getBytes());                    // 0-3: RIFF标识
        header.putInt(totalSize);                          // 4-7: 文件总长度-8
        header.put("WAVE".getBytes());                     // 8-11: WAVE标识

        // fmt Chunk
        header.put("fmt ".getBytes());                     // 12-15: fmt标识
        header.putInt(16);                                 // 16-19: fmt块长度(PCM=16)
        header.putShort((short) 1);                        // 20-21: 格式类别(PCM=1)
        header.putShort((short) channels);                 // 22-23: 声道数
        header.putInt(sampleRate);                         // 24-27: 采样率
        header.putInt(byteRate);                           // 28-31: 字节速率
        header.putShort((short) blockAlign);               // 32-33: 块对齐
        header.putShort((short) bitsPerSample);            // 34-35: 位深度

        // data Chunk
        header.put("data".getBytes());                     // 36-39: data标识
        header.putInt(dataSize);                           // 40-43: 数据长度

        // Step 4: 写入文件
        try (FileOutputStream fos = new FileOutputStream(outputPath)) {
            fos.write(header.array());  // 写入头部
            fos.write(pcmData);         // 写入PCM数据
        }

        System.out.println("WAV文件创建成功: " + outputPath);
        System.out.println("参数: " + sampleRate + "Hz, " + channels + "声道, " + bitsPerSample + "bit");
    }

    // 示例
    public static void main(String[] args) {
        try {
            String pcmBase64 = "YOUR_PCM_BASE64_STRING_HERE";

            // 常见参数组合：
            // 16000Hz, 单声道, 16bit (语音识别常用)
            convertPcmToWav(pcmBase64, "output.wav", 16000, 1, 16);

            // 或 44100Hz, 立体声, 16bit (音乐CD标准)
            // convertPcmToWav(pcmBase64, "output.wav", 44100, 2, 16);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
