"""
CLI 入口 — 直接运行工程任务（无需启动 API 服务器）
用法: python main.py --request "实现一个用户登录 API" --repo ./my_project
"""
import click
import json
import structlog

logging = structlog.get_logger()


@click.group()
def cli():
    """AI Engineering Employee Platform V2"""
    pass


@cli.command()
@click.option("--request", "-r", required=True, help="工程任务描述")
@click.option("--repo", default=".", help="项目路径")
@click.option("--executor", default="claude", type=click.Choice(["claude", "codex", "openhands", "gemini"]))
@click.option("--graph", default="engineering", type=click.Choice(["engineering", "bugfix", "review", "release"]))
@click.option("--max-attempts", default=3, type=int)
def run(request, repo, executor, graph, max_attempts):
    """运行工程任务"""
    from app.state import create_initial_state
    from app.graphs import GRAPH_REGISTRY

    click.echo(f"\n🤖 AI Engineering Employee Platform V2")
    click.echo(f"📋 Task: {request}")
    click.echo(f"📁 Repo: {repo}")
    click.echo(f"⚙️  Executor: {executor} | Graph: {graph}")
    click.echo("─" * 60)

    state = create_initial_state(user_request=request, repo_path=repo, executor=executor)
    state["max_attempts"] = max_attempts

    graph_obj = GRAPH_REGISTRY.get(graph)
    if not graph_obj:
        click.echo(f"❌ Unknown graph: {graph}", err=True)
        return

    try:
        final_state = graph_obj.invoke(state)
        click.echo(f"\n✅ Status: {final_state.get('status', 'unknown')}")
        click.echo(f"🔁 Attempts: {final_state.get('attempts', 0)}")

        if final_state.get("test_result"):
            t = final_state["test_result"]
            click.echo(f"🧪 Tests: ✅ {t.get('passed', 0)} passed / ❌ {t.get('failed', 0)} failed / 📊 {t.get('coverage', 'N/A')}")

        if final_state.get("report"):
            click.echo("\n📄 Report preview:")
            click.echo(final_state["report"][:1000])

    except Exception as e:
        click.echo(f"❌ Error: {e}", err=True)
        raise


@cli.command()
@click.option("--repo", default=".", help="项目路径")
def review(repo):
    """仅运行代码 Review"""
    run.callback(
        request="Code review",
        repo=repo,
        executor="claude",
        graph="review",
        max_attempts=1,
    )


@cli.command()
def server():
    """启动 FastAPI API 服务器"""
    import uvicorn
    from app.configs import settings
    click.echo(f"🚀 Starting API server on {settings.api_host}:{settings.api_port}")
    uvicorn.run(
        "app.main:app",
        host=settings.api_host,
        port=settings.api_port,
        reload=settings.debug,
    )


@cli.command()
def health():
    """检查所有执行器状态"""
    from app.executors import EXECUTOR_REGISTRY
    click.echo("Executor Health Check:")
    for name, cls in EXECUTOR_REGISTRY.items():
        try:
            executor = cls(repo_path=".")
            ok = executor.health_check()
            icon = "✅" if ok else "❌"
            click.echo(f"  {icon} {name}")
        except Exception as e:
            click.echo(f"  ❌ {name}: {e}")


if __name__ == "__main__":
    cli()
