import logging from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.ext.asyncio import AsyncSession from db.models import Intent from db.session import get_session from models.requests import IntentToggleRequest from models.responses import IntentInfo, IntentListResponse from services import config_service, intent_service logger = logging.getLogger(__name__) router = APIRouter(prefix="/intents", tags=["intents"]) async def _to_info(session: AsyncSession, intent: Intent) -> IntentInfo: active_cfg = await config_service.get_active_config_for_intent(session, intent.id) return IntentInfo( id=intent.id, code=intent.code, name=intent.name, description=intent.description or "", is_enabled=intent.is_enabled, order_index=intent.order_index, active_config_id=active_cfg.id if active_cfg else None, active_config_version=active_cfg.version if active_cfg else None, ) @router.get("", response_model=IntentListResponse) async def list_intents(session: AsyncSession = Depends(get_session)): intents = await intent_service.list_intents(session) infos = [await _to_info(session, i) for i in intents] return IntentListResponse(intents=infos, total=len(infos)) @router.get("/{code}", response_model=IntentInfo) async def get_intent(code: str, session: AsyncSession = Depends(get_session)): intent = await intent_service.get_intent_by_code(session, code) if intent is None: raise HTTPException(status_code=404, detail="Intent not found") return await _to_info(session, intent) @router.patch("/{code}", response_model=IntentInfo) async def toggle_intent( code: str, req: IntentToggleRequest, session: AsyncSession = Depends(get_session), ): intent = await intent_service.set_intent_enabled(session, code, req.is_enabled) if intent is None: raise HTTPException(status_code=404, detail="Intent not found") return await _to_info(session, intent)