import pygame
import speech_recognition as sr
from openai import OpenAI
from pathlib import Path
import time
import os
import io
import soundfile as sf
import sounddevice as sd

# Initialize OpenAI API key
api_key = 'sk-proj-wwWaxim1Qt13uqzSS0xjT3BlbkFJK0rZvx78AJiWG3Ot7d3S'
client = OpenAI(api_key=api_key)

def create_messages(question, file_content):
    return [
        {"role": "system", "content": "You are a helpful assistant who explains and answers about IoT use cases in Vodafone."},
        {"role": "user", "content": f"{file_content}\n\nQ: {question}\nA:"}
    ]

def play_audio(num):
    audio_files = {
        1: "speech1.mp3",
        2: "hydrosense.mp3",
        3: "Pushtotalk.mp3",
    }
    
    audio_file = audio_files.get(num)
    
    if audio_file:
        pygame.mixer.init()
        pygame.mixer.music.load(audio_file)
        pygame.mixer.music.play()
        while pygame.mixer.music.get_busy():
            time.sleep(1)

def recognize_speech():
    recognizer = sr.Recognizer()
    with sr.Microphone() as source:
        print("Listening...")
        audio = recognizer.listen(source)
        try:
            print("Recognizing...")
            text = recognizer.recognize_google(audio, language='en-US')
            print(f"You said: {text}")
            return text
        except sr.UnknownValueError:
            print("Sorry, I did not understand that.")
            return None
        except sr.RequestError:
            print("Sorry, there was an error with the speech recognition service.")
            return None

def get_response_from_openai(messages):
    response = client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=messages,
        max_tokens=150,
        temperature=0.5,
    )
    return  (response.choices[0].message.content)

def read_text_file(file_path):
    with open(file_path, 'r') as file:
        return file.read()

def generate_speech(text):
    spoken_response = client.audio.speech.create(
        model="tts-1",
        voice="alloy",
        response_format="opus",
        input=text
    )

    buffer = io.BytesIO()
    for chunk in spoken_response.iter_bytes(chunk_size=4096):
        buffer.write(chunk)
    buffer.seek(0)

    with sf.SoundFile(buffer, 'r') as sound_file:
        data = sound_file.read(dtype='int16')
        sd.play(data, sound_file.samplerate)
        sd.wait()

def start_qa_mode(file_content):
    while True:
        print("Please ask your question:")
        question = recognize_speech()

        if question and question.lower() in ["no", "go to next showcase", "exit"]:
            break

        if question:
            messages = create_messages(question, file_content)
            answer = get_response_from_openai(messages)
            print(f"Answer: {answer}")

            generate_speech(answer)
        else:
            print("Sorry, I didn't get that. Please ask again.")

def user_input():
    while True:
        try:
            num = int(input("Enter a number from 1 to 3: "))
            if 1 <= num <= 3:
                return num
            else:
                print("Invalid input. Please enter a number between 1 and 3.")
        except ValueError:
            print("Invalid input. Please enter a valid integer.")

def main():
    text_files = {
        1: "Gigabeeprotect.txt",
        2: "Hydrosense.txt",
        3: "Pushtotalk.txt",
    }

    while True:
        num = user_input()
        play_audio(num)
        file_content = read_text_file(text_files[num])
        start_qa_mode(file_content)

if __name__ == "__main__":
    main()
