# -*- coding: utf-8 -*-
"""
点选/悬浮数据解读接口 —— SSE 流式

点选解读是一次性的数据查询操作，不属于对话场景，
因此不写数据库（不创建会话、不保存消息）。
"""

import uuid

from fastapi import APIRouter
from fastapi.responses import StreamingResponse

from api.models import TunClickInterpretRequest, DeviceClickInterpretRequest
from api.sse_core import sse_event_generator
from api.fast_generators import fast_tun_sse_generator, fast_device_sse_generator
from agents.vent_agent import get_click_agent

router = APIRouter()


def _sse_response(generator, session_id: str) -> StreamingResponse:
    """构建统一的 SSE 响应对象"""
    return StreamingResponse(
        generator,
        media_type="text/event-stream",
        headers={
            "Cache-Control": "no-cache",
            "Connection": "keep-alive",
            "X-Accel-Buffering": "no",
            "X-Session-Id": session_id,
        },
    )


@router.post("/interpret/click/tun")
async def click_interpret_tun(req: TunClickInterpretRequest):
    """点选/悬浮数据解读接口（SSE 流式）
    用户点击某巷道数据行时触发，返回结构化的数据解读报告。

    mode 参数：
    - plan（默认）：走智能体 + Skills 全流程
    - fast：直接查数据 + LLM 生成报告，跳过 Agent 与知识库

    注意：点选解读不写数据库（不创建会话、不保存消息）。
    响应: SSE 流（text/event-stream）
    """
    thread_id = str(uuid.uuid4())
    session_id = str(uuid.uuid4())  # 仅用作 SSE 流标识，不写库

    # Fast 模式：直接查数据 + LLM 生成报告
    if req.mode == "fast":
        return _sse_response(
            fast_tun_sse_generator(req.tun_id, req.tun_name, thread_id, session_id, save_to_db=False),
            session_id,
        )

    # Plan 模式（默认）：走智能体全流程
    user_message = f"用户点击或选中某条巷道数据行，请执行巷道数据解读任务，该巷道ID为 {req.tun_id}，名称为 {req.tun_name}。"

    config = {"configurable": {"thread_id": thread_id}}
    agent = get_click_agent()

    return _sse_response(
        sse_event_generator(agent, user_message, thread_id, session_id, config, save_to_db=False),
        session_id,
    )


@router.post("/interpret/click/device")
async def click_interpret_device(req: DeviceClickInterpretRequest):
    """点选/悬浮数据解读接口（SSE 流式）
    用户点击某设备数据行时触发，返回结构化的数据解读报告。

    mode 参数：
    - plan（默认）：走智能体 + Skills 全流程
    - fast：直接查数据 + LLM 生成报告，跳过 Agent 与知识库

    注意：点选解读不写数据库（不创建会话、不保存消息）。
    响应: SSE 流（text/event-stream）
    """
    thread_id = str(uuid.uuid4())
    session_id = str(uuid.uuid4())  # 仅用作 SSE 流标识，不写库

    # Fast 模式：直接查数据 + LLM 生成报告
    if req.mode == "fast":
        return _sse_response(
            fast_device_sse_generator(req.device_id, req.device_name, req.device_type, thread_id, session_id, save_to_db=False),
            session_id,
        )

    # Plan 模式（默认）：走智能体全流程
    user_message = f"用户点击或选中某个设备，请执行设备数据解读任务，该设备ID为 {req.device_id}，类型为{req.device_type}，名称为 {req.device_name}。"

    config = {"configurable": {"thread_id": thread_id}}
    agent = get_click_agent()

    return _sse_response(
        sse_event_generator(agent, user_message, thread_id, session_id, config, save_to_db=False),
        session_id,
    )
