import pygame
import speech_recognition as sr
import openai
from pathlib import Path
import time
import os
import cv2
from pyzbar import pyzbar

# Initialize OpenAI API key
api_key = 'sk-proj-wwWfffaxim1Qt13uqzS6755567S0xjT3BlbkFJK0rZvx78AJiWG3Ot7d3S'
client = openai.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: "Gigabee.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.Completion.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, file_path):
    speech_file_path = Path(file_path).parent / "speech.mp3"
    if speech_file_path.exists():
        os.remove(speech_file_path)
    with client.Audio.create(
        model="tts-1",
        input=text,
        voice="alloy"
    ) as response:
        response.stream_to_file(str(speech_file_path))
    return str(speech_file_path)

def start_qa_mode(file_content):
    while True:
        print("Please ask your question:")
        question = recognize_speech()
        
        if question and question.lower() in ["no", "next showcase", "exit"]:
            break
        
        if question:
            messages = create_messages(question, file_content)
            answer = get_response_from_openai(messages)
            print(f"Answer: {answer}")
            
            speech_file_path = generate_speech(answer, "speech.mp3")
            pygame.mixer.init()
            pygame.mixer.music.load(speech_file_path)
            pygame.mixer.music.play()
            while pygame.mixer.music.get_busy():
                pygame.time.Clock().tick(10)  # Adjust as needed
            pygame.mixer.music.stop()  # Ensure music playback stops
            pygame.mixer.quit()  # Release resources
            os.remove(speech_file_path)

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

def scan_qr_code():
    cap = cv2.VideoCapture(0)
    while True:
        ret, frame = cap.read()
        if not ret:
            continue

        decoded_objects = pyzbar.decode(frame)
        for obj in decoded_objects:
            qr_data = obj.data.decode('utf-8')
            cap.release()
            cv2.destroyAllWindows()
            return qr_data

        cv2.imshow('QR Code Scanner', frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    cap.release()
    cv2.destroyAllWindows()
    return None

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

    audio_files = {
        "1": "Gigabee.mp3",
        "2": "hydrosense.mp3",
        "3": "Pushtotalk.mp3",
    }

    while True:
        print("Scan a QR code...")
        qr_data = scan_qr_code()
        if qr_data in text_files:
            play_audio(int(qr_data))
            file_content = read_text_file(text_files[qr_data])
            start_qa_mode(file_content)
        else:
            print("Invalid QR code. Please try again.")

if __name__ == "__main__":
    main()
