import { NextRequest, NextResponse } from 'next/server'
import { authenticateH5FromCookieHeader, getCookieHeaderFromRequest } from '@/lib/h5/auth'
import { h5Router, H5ForbiddenError } from '@/lib/h5/router'
import { abortH5Stream } from '@/lib/h5/active-streams'

export const runtime = 'nodejs'
export const dynamic = 'force-dynamic'

/**
 * POST /api/h5/chat/stop — 外部用户主动停止当前流式回复（方案 C）。
 *
 * 与「被动断开」不同：关页面/断网后引擎继续后台跑完落库；
 * 本接口才是真正中断引擎（abort SDK query）。
 *
 * 鉴权：forge_h5 cookie；session 归属用 external_user_id 校验（防越权停止他人）。
 */
export async function POST(req: NextRequest): Promise<Response> {
  const auth = authenticateH5FromCookieHeader(getCookieHeaderFromRequest(req))
  if (!auth) {
    return NextResponse.json({ error: 'Session expired', code: 'h5_expired' }, { status: 401 })
  }
  const { page, payload } = auth

  let body: { sessionId?: string }
  try {
    body = await req.json()
  } catch {
    return NextResponse.json({ error: 'Invalid JSON' }, { status: 400 })
  }

  const { sessionId } = body
  if (!sessionId) {
    return NextResponse.json({ error: 'sessionId required' }, { status: 400 })
  }

  // 校验 session 归属（resolveSession 传 sessionId 时纯校验、不创建，失败抛 403）
  try {
    h5Router.resolveSession(page, payload.externalUserId, sessionId, payload.name)
  } catch (err) {
    if (err instanceof H5ForbiddenError) {
      return NextResponse.json({ error: 'Forbidden' }, { status: 403 })
    }
    throw err
  }

  const aborted = abortH5Stream(sessionId)
  return NextResponse.json({ ok: aborted })
}
