#structure data extraction 
from openai import OpenAI
import json
import os
from dotenv import load_dotenv

load_dotenv()
api_key = os.getenv("OPENAI_API_KEY")
client = OpenAI(api_key=api_key)

def extract_student_info(description):
    """
    Extracts structured student information from a given description.
    """
    # Initialize the dictionary to store extracted information
    student_info = {
        "name": None,
        "major": None,
        "school": None,
        "grades": None,
        "club": []
    }

    # Use OpenAI's function calling to extract information
    # (Assuming you have set up the function calling as per OpenAI's documentation)

    return student_info

functions = [
    {
        "name": "extract_student_info",
        "description": "Extracts structured student information from a given description.",
        "parameters": {
            "type": "object",
            "properties": {
                "description": {
                    "type": "string",
                    "description": "A detailed description of the student."
                }
            },
            "required": ["description"]
        }
    }
]

def query_openai(prompt):
    response = client.chat.completions.create(
        model='gpt-4o-mini',
        messages=[{'role': 'user', 'content': prompt}],
        functions=functions,
        function_call='auto',
    )

    message = response['choices'][0]['message']

    if message.get('function_call'):
        function_name = message['function_call']['name']
        function_args = json.loads(message['function_call']['arguments'])

        if function_name == 'extract_student_info':
            description = function_args.get('description')
            function_response = extract_student_info(description)

            return function_response

    return message['content']

import gradio as gr

def gradio_interface(description):
    prompt = f"Please extract the following information from the given text and return it as a JSON object:\n\nname\nmajor\nschool\ngrades\nclub\nThis is the body of text to extract the information from:\n{description}"
    result = query_openai(prompt)
    return result

iface = gr.Interface(
    fn=gradio_interface,
    inputs=gr.inputs.Textbox(lines=10, label="Student Description"),
    outputs=gr.outputs.JSON(label="Extracted Student Information"),
    title="Student Information Extractor",
    description="Enter a student's description to extract structured information."
)

iface.launch()