"""
Celery 任务定义
"""
import structlog

from .celery_app import celery_app
from app.state import create_initial_state
from app.graphs import GRAPH_REGISTRY
from app.memory import ProjectMemory

logger = structlog.get_logger()
memory = ProjectMemory()


@celery_app.task(
    name="app.queue.tasks.run_engineering_task",
    bind=True,
    max_retries=3,
    default_retry_delay=30,
)
def run_engineering_task(
    self,
    user_request: str,
    repo_path: str,
    executor: str = "claude",
    project_id: str = None,
    graph_type: str = "engineering",
):
    """执行工程任务（Celery 任务）"""
    task_id = self.request.id
    logger.info("Celery task started", task_id=task_id, graph_type=graph_type)

    state = create_initial_state(
        user_request=user_request,
        repo_path=repo_path,
        executor=executor,
        project_id=project_id,
    )

    graph = GRAPH_REGISTRY.get(graph_type)
    if not graph:
        raise ValueError(f"Unknown graph type: {graph_type}")

    try:
        self.update_state(state="STARTED", meta={"status": "running"})
        final_state = graph.invoke(state)
        memory.save_task(state["task_id"], dict(final_state))

        return {
            "task_id": state["task_id"],
            "status": final_state.get("status", "completed"),
            "report": final_state.get("report", ""),
        }
    except Exception as e:
        logger.error("Task failed", error=str(e))
        raise self.retry(exc=e, countdown=60)


@celery_app.task(name="app.queue.tasks.run_bugfix_task", bind=True, max_retries=2)
def run_bugfix_task(self, user_request: str, repo_path: str, executor: str = "claude"):
    return run_engineering_task(
        self, user_request=user_request, repo_path=repo_path,
        executor=executor, graph_type="bugfix"
    )


@celery_app.task(name="app.queue.tasks.run_review_task", bind=True, max_retries=1)
def run_review_task(self, repo_path: str):
    return run_engineering_task(
        self, user_request="Code review", repo_path=repo_path,
        executor="claude", graph_type="review"
    )
