package com.prayagad.speech.utils;

import android.content.Context;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.modules.core.DeviceEventManagerModule;

/**
 * Created by skishore on 16/3/17.
 */
public class AudioRecordProxy extends BluetoothController {

    private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;
    public static final int MULTIPLY = 2;
    private AudioRecord audioRecord;

    public int getRecorderSamplerRate() {
        return recorderSamplerRate;
    }

    public void setRecorderSamplerRate(int recorderSamplerRate) {
        this.recorderSamplerRate = recorderSamplerRate;
    }

    public int getBytesPerBuffer() {
        return bytesPerBuffer;
    }

    public void setBytesPerBuffer(int bytesPerBuffer) {
        this.bytesPerBuffer = bytesPerBuffer;
    }

    private int recorderSamplerRate;
    private int bytesPerBuffer;

    public AudioRecord getAudioRecordInstance() {
        return this.audioRecord;
    }

    /**
     * Constructor
     *
     * @param context
     */
    public AudioRecordProxy(Context context) {
        super(context);
        setPhoneMic();
    }

    private void setPhoneMic() {
        recorderSamplerRate = Integer.parseInt(this.getmAudioManager().getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE));
        bytesPerBuffer = AudioRecord.getMinBufferSize(recorderSamplerRate, AudioFormat.CHANNEL_IN_DEFAULT, RECORDER_AUDIO_ENCODING) * MULTIPLY;
        audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, recorderSamplerRate, AudioFormat.CHANNEL_IN_DEFAULT, RECORDER_AUDIO_ENCODING, bytesPerBuffer);
    }

    private void setBluetoothMic() {
        //smapler Rate should be 8khz
        recorderSamplerRate = Integer.parseInt(this.getmAudioManager().getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE));
        bytesPerBuffer = AudioRecord.getMinBufferSize(recorderSamplerRate, AudioFormat.CHANNEL_IN_MONO, RECORDER_AUDIO_ENCODING) * MULTIPLY;
        audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, recorderSamplerRate, AudioFormat.CHANNEL_IN_MONO, RECORDER_AUDIO_ENCODING, bytesPerBuffer);
    }

    @Override
    public void onHeadsetDisconnected() {
        System.out.println("Headset Disconnected");
    }

    @Override
    public void onHeadsetConnected() {
        System.out.println("Headset Connected");
    }

    @Override
    public void onScoAudioDisconnected() {
        setPhoneMic();
        ((ReactApplicationContext) this.getmContext()).getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit("MIC_SOURCE_CHANGE", "PHONE_MIC");
    }

    @Override
    public void onScoAudioConnected() {
        setBluetoothMic();
        ((ReactApplicationContext) this.getmContext()).getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit("MIC_SOURCE_CHANGE", "BLUETOOTH_MIC");
    }
}
