"""Agente de negocio: propuestas lab → Accept → Cursor Bridge."""

from __future__ import annotations

from fastapi import APIRouter, Depends, HTTPException
from pydantic import BaseModel, Field

from app.api.deps import require_admin
from app.models import User
from app.services import bridge_exec, proposals

router = APIRouter(prefix="/agent", tags=["agent"])


class RejectIn(BaseModel):
    reason: str = ""


class AcceptIn(BaseModel):
    wait: bool = False


@router.get("/bridge/status")
def bridge_status(_: User = Depends(require_admin)):
    return bridge_exec.bridge_status()


@router.get("/proposals")
def list_proposals(status: str | None = None, _: User = Depends(require_admin)):
    proposals.ensure_seed_if_empty()
    return {"items": proposals.list_proposals(status)}


@router.post("/proposals/generate")
def generate_proposals(_: User = Depends(require_admin)):
    items = proposals.generate_from_lab(use_llm=True, count=5)
    return {"ok": True, "count": len(items), "items": items}


@router.post("/proposals/{pid}/accept")
def accept_proposal(pid: str, payload: AcceptIn | None = None, _: User = Depends(require_admin)):
    wait = bool(payload.wait) if payload else False
    try:
        item = proposals.accept_and_execute(pid, wait=wait)
    except FileNotFoundError:
        raise HTTPException(404, "Propuesta no encontrada") from None
    except ValueError as exc:
        raise HTTPException(400, str(exc)) from None
    return {"ok": True, "item": item}


@router.post("/proposals/{pid}/reject")
def reject_proposal(pid: str, payload: RejectIn | None = None, _: User = Depends(require_admin)):
    try:
        item = proposals.reject(pid, (payload.reason if payload else "") or "")
    except FileNotFoundError:
        raise HTTPException(404, "Propuesta no encontrada") from None
    return {"ok": True, "item": item}
