"""
LangGraph Beispiel: Finanz-Compliance-Prüfung
"""

from typing import TypedDict, Optional, Dict, Any
from langgraph.graph import StateGraph, END

# Zustandstyp definieren
class FinanceState(TypedDict):
    document: str
    financial_data: Optional[Dict[str, Any]]
    compliance_status: Optional[str]
    recommendation: Optional[str]

# Dummy-Funktionen für die Analyse
def analyze_financial_statement(state: FinanceState) -> Dict[str, Any]:
    # Analyse der Finanzdaten (vereinfacht)
    document = state["document"]
    print(f"Analysiere Finanzdaten aus: {document}")
    
    # Simulierte Analyse basierend auf Dokumentnamen
    if "high_risk" in document.lower():
        analyzed_data = {"risk_level": "high", "anomalies": True, "score": 8.7}
    elif "medium_risk" in document.lower():
        analyzed_data = {"risk_level": "medium", "anomalies": False, "score": 5.4}
    else:
        analyzed_data = {"risk_level": "low", "anomalies": False, "score": 2.1}
    
    return {"financial_data": analyzed_data}

def check_compliance(state: FinanceState) -> Dict[str, Any]:
    # Compliance-Prüfung (vereinfacht)
    financial_data = state["financial_data"]
    print(f"Prüfe Compliance für Daten: {financial_data}")
    
    # Simulierte Compliance-Prüfung
    if financial_data["risk_level"] == "high" and financial_data["anomalies"]:
        status = "critical"
    elif financial_data["risk_level"] == "medium" or financial_data["score"] > 5.0:
        status = "review_needed"
    else:
        status = "compliant"
    
    return {"compliance_status": status}

def route_to_expert(state: FinanceState) -> str:
    # Routing-Logik
    status = state["compliance_status"]
    print(f"Routing basierend auf Status: {status}")
    
    if status == "critical":
        return "escalate_to_senior"
    elif status == "review_needed":
        return "assign_to_analyst"
    else:
        return "auto_approve"

def escalate_function(state: FinanceState) -> Dict[str, Any]:
    # Eskalation an Senior-Experten
    print("Eskalation an Senior Risk Manager")
    return {"recommendation": "Dringender Review durch Senior Risk Manager erforderlich"}

def analyst_function(state: FinanceState) -> Dict[str, Any]:
    # Zuweisung an Analysten
    print("Zuweisung an Finanzanalysten")
    return {"recommendation": "Review durch Finanzanalysten empfohlen"}

def approve_function(state: FinanceState) -> Dict[str, Any]:
    # Automatische Genehmigung
    print("Automatische Genehmigung")
    return {"recommendation": "Dokument entspricht allen Compliance-Anforderungen"}

# Graph erstellen
graph = StateGraph(FinanceState)

# Knoten hinzufügen
graph.add_node("analyze", analyze_financial_statement)
graph.add_node("compliance", check_compliance)
graph.add_node("escalate_to_senior", escalate_function)
graph.add_node("assign_to_analyst", analyst_function)
graph.add_node("auto_approve", approve_function)

# Kanten hinzufügen
graph.add_edge("analyze", "compliance")
graph.add_conditional_edges("compliance", route_to_expert, {
    "escalate_to_senior": "escalate_to_senior",
    "assign_to_analyst": "assign_to_analyst",
    "auto_approve": "auto_approve"
})
graph.add_edge("escalate_to_senior", END)
graph.add_edge("assign_to_analyst", END)
graph.add_edge("auto_approve", END)

# Startknoten definieren
graph.set_entry_point("analyze")

# Graph kompilieren
app = graph.compile()

# Testfälle
test_cases = [
    {"document": "high_risk_financial_report.pdf"},
    {"document": "medium_risk_quarterly_statement.pdf"},
    {"document": "low_risk_standard_report.pdf"}
]

# Graph testen
for i, test_input in enumerate(test_cases):
    print(f"\n--- Testfall {i+1}: {test_input['document']} ---")
    result = app.invoke(test_input)
    print(f"\nErgebnis: {result}\n")

# Graph visualisieren
try:
    from IPython.display import Image
    from langchain_core.runnables.graph import MermaidDrawMethod
    
    print("\nErstelle Visualisierung...")
    
    # Generate PNG using Mermaid API
    png_data = app.get_graph().draw_mermaid_png(
        draw_method=MermaidDrawMethod.API
    )
    
    # Save the PNG to a file
    with open("finance_compliance_graph.png", "wb") as f:
        f.write(png_data)
    print("Graph-Visualisierung gespeichert als: finance_compliance_graph.png")
    
except ImportError:
    print("\nVisualisierungspakete nicht verfügbar.")
    print("Für die Visualisierung installieren Sie: pip install ipython pillow langchain-core")
    
    # Alternative: Mermaid-Code direkt ausgeben
    try:
        mermaid_code = app.get_graph().get_mermaid()
        
        with open("finance_compliance_graph.md", "w") as f:
            f.write("# Finanz-Compliance-Workflow\n\n")
            f.write("```mermaid\n")
            f.write(mermaid_code)
            f.write("\n```\n")
        print("Mermaid-Code gespeichert als: finance_compliance_graph.md")
        
        # HTML-Datei mit Mermaid erstellen
        html_content = f"""
<!DOCTYPE html>
<html>
<head>
    <title>Finanz-Compliance-Workflow</title>
    <script src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script>
    <script>
        mermaid.initialize({{ startOnLoad: true }});
    </script>
</head>
<body>
    <h1>Finanz-Compliance-Workflow</h1>
    <p>Dieses Diagramm zeigt den Ablauf des Finanz-Compliance-Prozesses.</p>
    <div class="mermaid">
{mermaid_code}
    </div>
</body>
</html>
"""
        with open("finance_compliance_graph.html", "w") as f:
            f.write(html_content)
        print("HTML-Datei mit Mermaid-Diagramm gespeichert als: finance_compliance_graph.html")
        
    except Exception as e:
        print(f"Fehler beim Erstellen des Mermaid-Codes: {e}")
