from fastapi import APIRouter, Depends, HTTPException, BackgroundTasks from pydantic import BaseModel, Field from endpoints.projects import get_db from core.projects.models import Project from core.subscription.middleware import verify_token from core.graph_rag.msp_analyzer import msp_analyzer import logging logger = logging.getLogger(__name__) router = APIRouter(prefix="/api/graph", tags=["graph_rag"]) class MSPAnalysisRequest(BaseModel): project_id: str krs: str = Field( description="Numer KRS firmy do analizy (np. 0000111111 dla testu)" ) @router.post("/analyze_msp") async def analyze_msp( request: MSPAnalysisRequest, background_tasks: BackgroundTasks, token_data: dict = Depends(verify_token), db=Depends(get_db), ): """ Analizuje status MŚP firmy o danym numerze KRS poprzez budowę grafu w Neo4j i kalkulację powiązań własnościowych. Wynik jest zapisywany w kontekście projektu. """ clerk_id = token_data.get("sub") project = ( db.query(Project) .filter(Project.id == request.project_id, Project.clerk_user_id == clerk_id) .first() ) if not project: raise HTTPException( status_code=404, detail="Projekt nie istnieje lub brak dostępu" ) try: # 1. Zbudowanie grafu w Neo4j na podstawie danych z Rejestr.io # (Wymaga połączenia do AuraDB. Jeśli nie ma, zwróci error w kolejnym kroku) await msp_analyzer.build_graph_for_company(request.krs, depth=1) # 2. Wykonanie analizy grafowej report = msp_analyzer.analyze_msp_status(request.krs) # 3. Zapisz raport do kontekstu projektu (jeśli się powiodło) if report.get("status") == "ok": external_context = project.external_context or {} external_context["msp_report"] = report project.external_context = external_context db.commit() return report except Exception as e: logger.error( f"Error during MSP Analysis for KRS {request.krs}: {e}", exc_info=True ) return {"status": "error", "message": str(e)}