import threading
import pyaudio
import wave
import subprocess
import time

# Global variables
recording = False
frames = []
audio_stream = None
audio_interface = None


def merge_audio_video(video_file, audio_file, output_file):
    """
    Merges audio and video into a single file.
    """
    print("Merging audio and video...")
    # Using ffmpeg to combine the video and audio
    subprocess.run(["ffmpeg", "-i", video_file, "-i", audio_file, "-c:v", "libx264", "-c:a", "aac", "-strict", "experimental", output_file])
    print("Merging complete.")

def start_audio_recording(output_audio="audio.wav"):
    global recording, frames, audio_stream, audio_interface

    # Audio configuration
    chunk = 1024  # Record in chunks of 1024 samples
    format = pyaudio.paInt16  # 16-bit resolution
    channels = 1  # Mono
    rate = 44100  # 44.1 kHz sample rate

    # Initialize PyAudio
    audio_interface = pyaudio.PyAudio()
    audio_stream = audio_interface.open(format=format, channels=channels,
                                        rate=rate, input=True,
                                        frames_per_buffer=chunk)

    recording = True
    frames = []
    print("Audio recording started...")

    # Recording loop in a separate thread
    def record_audio():
        global frames
        while recording:
            try:
                data = audio_stream.read(chunk, exception_on_overflow=False)
                frames.append(data)
            except Exception as e:
                print(f"Audio recording error: {e}")

    # Start the audio recording thread
    threading.Thread(target=record_audio, daemon=True).start()


def stop_audio_recording(output_audio="audio.wav"):
    global recording, frames, audio_stream, audio_interface

    print("Stopping audio recording...")
    recording = False

    # Close the audio stream
    audio_stream.stop_stream()
    audio_stream.close()
    audio_interface.terminate()

    # Save the audio to a file
    with wave.open(output_audio, "wb") as wave_file:
        wave_file.setnchannels(1)  # Mono
        wave_file.setsampwidth(audio_interface.get_sample_size(pyaudio.paInt16))
        wave_file.setframerate(44100)  # Sample rate
        wave_file.writeframes(b"".join(frames))

    print(f"Audio recording stopped. Saved to {output_audio}")


