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

# 1. DEFINIAMO LO STATO
# È il "pacchetto" che viaggia tra i nodi
class MyState(TypedDict):
    text: str

# 2. DEFINIAMO I NODI (Le funzioni di lavoro)
def nodo_maiuscolo(state: MyState):
    print(f"--- [Nodo 1] Trasformo in maiuscolo: {state['text']} ---")
    # Prendo il testo, lo modifico e restituisco l'aggiornamento
    return {"text": state['text'].upper()}

def nodo_esclamativo(state: MyState):
    print(f"--- [Nodo 2] Aggiungo esclamazione ---")
    return {"text": state['text'] + "!!!"}

# 3. COSTRUIAMO IL GRAFO
workflow = StateGraph(MyState)

# Aggiungo i nodi al grafo
workflow.add_node("maiuscolo", nodo_maiuscolo)
workflow.add_node("esclamativo", nodo_esclamativo)

# 4. DEFINIAMO IL FLUSSO (GLI EDGES)
# Entry point: da dove si inizia?
workflow.set_entry_point("maiuscolo")

# Collegamenti: da maiuscolo vai a esclamativo
workflow.add_edge("maiuscolo", "esclamativo")

# Da esclamativo vai alla fine (END)
workflow.add_edge("esclamativo", END)

# 5. COMPILIAMO ED ESEGUIAMO
app = workflow.compile()

# Esecuzione
inputs = {"text": "ciao prof sono un agente"}
result = app.invoke(inputs)

print("\nRISULTATO FINALE:")
print(result)