# pip install langgraph 

from typing import TypedDict
from langgraph.graph import StateGraph,START,END

# -------------------------
# State Definition
# -------------------------
class AgentState(TypedDict):
    query: str
        intent: str
            response: str


            # -------------------------
            # Intent Classifier
            # -------------------------
            def intent_classifier(state):
                query = state["query"].lower()

                    if "admission" in query:
                            state["intent"] = "admission"
                                elif "exam" in query:
                                        state["intent"] = "exam"
                                            elif "fee" in query:
                                                    state["intent"] = "fees"
                                                        elif "scholarship" in query:
                                                                state["intent"] = "scholarship"
                                                                    else:
                                                                            state["intent"] = "unknown"

                                                                                return state


                                                                                # -------------------------
                                                                                # Specialized Agents
                                                                                # -------------------------
                                                                                def admission_agent(state):
                                                                                    state["response"] = "Admission starts from 1st July."
                                                                                        return state


                                                                                        def exam_agent(state):
                                                                                            state["response"] = "Exams begin from 10th December."
                                                                                                return state


                                                                                                def fees_agent(state):
                                                                                                    state["response"] = "Semester fee is Rs. 50,000."
                                                                                                        return state


                                                                                                        def scholarship_agent(state):
                                                                                                            state["response"] = "Scholarship available for students scoring above 85%."
                                                                                                                return state


                                                                                                                # -------------------------
                                                                                                                # Response Agent
                                                                                                                # -------------------------
                                                                                                                def response_agent(state):
                                                                                                                    print("\n========== RESPONSE ==========")
                                                                                                                        print(state["response"])
                                                                                                                            return state


                                                                                                                            # -------------------------
                                                                                                                            # Build LangGraph
                                                                                                                            # -------------------------
                                                                                                                            graph = StateGraph(AgentState)

                                                                                                                            graph.add_node("IntentClassifier", intent_classifier)
                                                                                                                            graph.add_node("AdmissionAgent", admission_agent)
                                                                                                                            graph.add_node("ExamAgent", exam_agent)
                                                                                                                            graph.add_node("FeesAgent", fees_agent)
                                                                                                                            graph.add_node("ScholarshipAgent", scholarship_agent)
                                                                                                                            graph.add_node("ResponseAgent", response_agent)

                                                                                                                            graph.set_entry_point("IntentClassifier")


                                                                                                                            # Routing Logic
                                                                                                                            def router(state):
                                                                                                                                return state["intent"]


                                                                                                                                graph.add_conditional_edges(
                                                                                                                                    "IntentClassifier",
                                                                                                                                        router,
                                                                                                                                            {
                                                                                                                                                    "admission": "AdmissionAgent",
                                                                                                                                                            "exam": "ExamAgent",
                                                                                                                                                                    "fees": "FeesAgent",
                                                                                                                                                                            "scholarship": "ScholarshipAgent",
                                                                                                                                                                                },
                                                                                                                                                                                )

                                                                                                                                                                                graph.add_edge("AdmissionAgent", "ResponseAgent")
                                                                                                                                                                                graph.add_edge("ExamAgent", "ResponseAgent")
                                                                                                                                                                                graph.add_edge("FeesAgent", "ResponseAgent")
                                                                                                                                                                                graph.add_edge("ScholarshipAgent", "ResponseAgent")

                                                                                                                                                                                graph.add_edge("ResponseAgent", END)

                                                                                                                                                                                app = graph.compile()


                                                                                                                                                                                # -------------------------
                                                                                                                                                                                # Run Example
                                                                                                                                                                                # -------------------------
                                                                                                                                                                                query = input("Enter your query: ")

                                                                                                                                                                                app.invoke({
                                                                                                                                                                                    "query": query,
                                                                                                                                                                                        "intent": "",
                                                                                                                                                                                            "response": ""
                                                                                                                                                                                            })