import re
import os
from apiclient import discovery
from oauth2client import client, file, tools
import bardapi
from transformers import pipeline, AutoModelForQuestionAnswering, AutoTokenizer
from transformers import T5ForConditionalGeneration, T5Tokenizer

SCOPES = "https://www.googleapis.com/auth/forms.body"
DISCOVERY_DOC = "https://forms.googleapis.com/$discovery/rest?version=v1"

NEW_FORM = {
    "info": {
        "title": "Quiz"
    }
}

model_name = "t5-base"
model = T5ForConditionalGeneration.from_pretrained(model_name)
tokenizer = T5Tokenizer.from_pretrained(model_name)

def generate_quiz_questions(prompt):
    # Set your Bard API key as an environment variable
    os.environ['_BARD_API_KEY'] = "WwgqSrcbBC71HsiWpTlqnbDC9TQ3-9N1YyY6CHxOEfFp_qeCe0laziZoOT_dkTEjhJmOcw."
    
    prompt_suffix = ". Each generated question has to begin with '🔹', each choice has to begin with '🔸', and each correct answer has to begin with '✔️'."


    # Send API requests and get responses
    response = bardapi.core.Bard().get_answer(prompt + prompt_suffix)

    quiz = response["content"]

    return quiz

'''
def generate_quiz_url(prompt_text, form_service):
    # Generate quiz questions based on the transcribed text
    text = generate_quiz_questions(prompt_text)

    # Questions, choices, and correct answers
    questions = re.findall(r"🔹 (.*?)\n", text)
    choices = re.findall(r"🔸 (.*?)\n", text)
    answers = re.findall(r"✔️ (.*?)\n", text)

    # Remove the '**' from the questions list (they are not part of the question), choices, and correct answers
    questions = [question.replace('**', '') for question in questions]
    answers = [answer.replace('**', '') for answer in answers]

    questions_list = []

    # Fill the questions_list variable
    for i, question in enumerate(questions):
        choices_for_question = choices[i * 4:(i + 1) * 4]
        correct_answer = answers[i] if i < len(answers) else ""

        question_dict = {
            "question": question,
            "choices": choices_for_question,
            "correct_answer": correct_answer
        }

        questions_list.append(question_dict)

    # Create the initial form
    result = form_service.forms().create(body=NEW_FORM).execute()

    # Add the questions to the form
    question_requests = []
    for index, question in enumerate(questions_list):
        new_question = {
            "createItem": {
                "item": {
                    "title": question["question"],
                    "questionItem": {
                        "question": {
                            "required": True,
                            "choiceQuestion": {
                                "type": "RADIO",
                                "options": [
                                    {"value": choice} for choice in question["choices"]
                                ],
                                "shuffle": True
                            }
                        }
                    }
                },
                "location": {
                    "index": index
                }
            }
        }
        question_requests.append(new_question)

    NEW_QUESTIONS = {
        "requests": question_requests
    }

    question_setting = form_service.forms().batchUpdate(formId=result["formId"], body=NEW_QUESTIONS).execute()

    # Retrieve the updated form result
    get_result = form_service.forms().get(formId=result["formId"]).execute()

    # Get the form ID
    form_id = get_result["formId"]

    # Construct the quiz link using the form ID
    form_url = result["responderUri"]

    return form_url
'''

def explain_quiz_answers(questions_list):
    explanations = []

    for question in questions_list:
        context = question["question"]
        choices = question["choices"]
        correct_answer = question["correct_answer"]

        explanation = f"Question: {context}\n"

        for choice in choices:
            # Construct a query with each choice as a question
            query = f"What is the reason for choosing '{choice}' in {context}?"

            # Tokenize the query and context
            inputs = tokenizer.encode_plus(query, context, return_tensors="pt", truncation=True, padding="max_length", max_length=512)

            # Generate the explanation using the T5 model
            outputs = model.generate(input_ids=inputs["input_ids"], attention_mask=inputs["attention_mask"], max_length=256)

            # Decode the explanation
            explanation_text = tokenizer.decode(outputs[0], skip_special_tokens=True)

            # Add the explanation to the overall explanation
            explanation += f"\nChoice: {choice}\nExplanation: {explanation_text}"

            # Add an indicator if the choice is the correct answer
            if choice == correct_answer:
                explanation += " (Correct Answer)"

            explanation += "\n"

        explanations.append(explanation)

    return explanations


def generate_quiz_url(prompt_text, form_service):
    # Generate quiz questions based on the transcribed text
    text = generate_quiz_questions(prompt_text)

    # Questions, choices, and correct answers
    questions = re.findall(r"🔹 (.*?)\n", text)
    choices = re.findall(r"🔸 (.*?)\n", text)
    answers = re.findall(r"✔️ (.*?)\n", text)

    # Remove the '**' from the questions list (they are not part of the question), choices, and correct answers
    questions = [question.replace('**', '') for question in questions]
    answers = [answer.replace('**', '') for answer in answers]

    questions_list = []

    # Fill the questions_list variable
    for i, question in enumerate(questions):
        choices_for_question = choices[i * 4:(i + 1) * 4]
        correct_answer = answers[i] if i < len(answers) else ""

        question_dict = {
            "question": question,
            "choices": choices_for_question,
            "correct_answer": correct_answer
        }

        questions_list.append(question_dict)

    # Create the initial form
    result = form_service.forms().create(body=NEW_FORM).execute()

    # Add the questions to the form
    question_requests = []
    for index, question in enumerate(questions_list):
        new_question = {
            "createItem": {
                "item": {
                    "title": question["question"],
                    "questionItem": {
                        "question": {
                            "required": True,
                            "choiceQuestion": {
                                "type": "RADIO",
                                "options": [
                                    {"value": choice} for choice in question["choices"]
                                ],
                                "shuffle": True
                            }
                        }
                    }
                },
                "location": {
                    "index": index
                }
            }
        }
        question_requests.append(new_question)

    NEW_QUESTIONS = {
        "requests": question_requests
    }

    question_setting = form_service.forms().batchUpdate(formId=result["formId"], body=NEW_QUESTIONS).execute()

    # Retrieve the updated form result
    get_result = form_service.forms().get(formId=result["formId"]).execute()

    # Get the form ID
    form_id = get_result["formId"]

    # Construct the quiz link using the form ID
    form_url = result["responderUri"]

    # Get the explanations for the quiz
    explanations = explain_quiz_answers(questions_list)

    return form_url, explanations