"""
Release Graph
prepare_release → run_tests → generate_changelog → create_pr
"""
import structlog
from langgraph.graph import StateGraph, END

from app.state import EngineeringState
from app.agents import TesterAgent, ReporterAgent
from app.tools.git_manager import GitManager

logger = structlog.get_logger()


def node_prepare_release(state: EngineeringState) -> EngineeringState:
    logger.info("Release: prepare_release")
    git = GitManager(state.get("repo_path", "."))
    log = git.get_log(20)
    return {
        **state,
        "sandbox_path": state.get("repo_path", ""),
        "project_analysis": {**state.get("project_analysis", {}), "git_log": log},
        "status": "release_prepared",
    }


def node_run_tests(state: EngineeringState) -> EngineeringState:
    logger.info("Release: run_tests")
    tester = TesterAgent()
    result = tester.run_tests(state)
    return {**state, "test_result": result, "status": "tested" if result.get("success") else "test_failed"}


def node_generate_changelog(state: EngineeringState) -> EngineeringState:
    logger.info("Release: generate_changelog")
    reporter = ReporterAgent(reports_dir="./reports")
    output = reporter.generate_report(state)
    return {**state, "report": output["report"], "pr_description": output["pr_description"]}


def node_create_pr(state: EngineeringState) -> EngineeringState:
    logger.info("Release: create_pr")
    git = GitManager(state.get("repo_path", "."))
    pr_result = git.git_pr(
        title=f"Release: {state.get('user_request', 'New release')[:72]}",
        body=state.get("pr_description", ""),
        base="main",
    )
    return {**state, "diff_result": {**state.get("diff_result", {}), "pr": pr_result}, "status": "completed"}


def build_release_graph() -> StateGraph:
    graph = StateGraph(EngineeringState)
    graph.add_node("prepare_release", node_prepare_release)
    graph.add_node("run_tests", node_run_tests)
    graph.add_node("generate_changelog", node_generate_changelog)
    graph.add_node("create_pr", node_create_pr)

    graph.set_entry_point("prepare_release")
    graph.add_edge("prepare_release", "run_tests")
    graph.add_edge("run_tests", "generate_changelog")
    graph.add_edge("generate_changelog", "create_pr")
    graph.add_edge("create_pr", END)
    return graph.compile()


release_graph = build_release_graph()
