"""
Review Graph
scan_code → security_review → performance_review → report
"""
import json
from pathlib import Path
import structlog
from langgraph.graph import StateGraph, END

from app.state import EngineeringState
from app.agents import ReviewerAgent, ReporterAgent
from app.configs import settings

logger = structlog.get_logger()


def node_scan_code(state: EngineeringState) -> EngineeringState:
    logger.info("Review: scan_code")
    # Static scan: list all code files
    repo = Path(state.get("repo_path", "."))
    code_files = [
        str(f.relative_to(repo))
        for f in repo.rglob("*")
        if f.is_file() and f.suffix in (".py", ".js", ".ts", ".go", ".rs", ".java", ".cs")
    ]
    return {
        **state,
        "project_analysis": {**state.get("project_analysis", {}), "code_files": code_files},
        "sandbox_path": state.get("repo_path", ""),
        "status": "scanned",
    }


def node_security_review(state: EngineeringState) -> EngineeringState:
    logger.info("Review: security_review")
    reviewer = ReviewerAgent()

    # Patch diff to include all files for security scan
    all_files = state.get("project_analysis", {}).get("code_files", [])
    patched = {**state, "diff_result": {"modified": all_files[:20], "added": [], "deleted": []}}
    result = reviewer.review(EngineeringState(**patched))

    security_issues = result.get("security", [])
    return {
        **state,
        "review_result": {**state.get("review_result", {}), "security": security_issues},
        "status": "security_reviewed",
    }


def node_performance_review(state: EngineeringState) -> EngineeringState:
    logger.info("Review: performance_review")
    reviewer = ReviewerAgent()
    result = reviewer.review(state)
    perf_issues = result.get("performance", [])
    full_review = {**state.get("review_result", {}), **result, "performance": perf_issues}
    return {**state, "review_result": full_review, "status": "performance_reviewed"}


def node_report(state: EngineeringState) -> EngineeringState:
    logger.info("Review: report")
    reporter = ReporterAgent(reports_dir="./reports")
    output = reporter.generate_report(state)
    return {**state, "report": output["report"], "status": "completed"}


def build_review_graph() -> StateGraph:
    graph = StateGraph(EngineeringState)
    graph.add_node("scan_code", node_scan_code)
    graph.add_node("security_review", node_security_review)
    graph.add_node("performance_review", node_performance_review)
    graph.add_node("report", node_report)

    graph.set_entry_point("scan_code")
    graph.add_edge("scan_code", "security_review")
    graph.add_edge("security_review", "performance_review")
    graph.add_edge("performance_review", "report")
    graph.add_edge("report", END)
    return graph.compile()


review_graph = build_review_graph()
