/**
 * POST /api/print-agent/enroll  (no session — called once by a fresh agent)
 * Body: { code, name?, hostname?, platform?, version? }
 * → { ok, agentId, token, name, clientId, orgId, instance, poll }
 *
 * The code comes from Settings → Printers → Print-Agent ("Enrolment-Code erzeugen"), is valid
 * 24 h and single-use. The token is returned exactly once; the agent stores it in
 * /etc/logship-print-agent/agent.env.
 */
import { enrollAgent } from '../../utils/printSpoolDb'
import { rateLimit, clientIp, instanceOrigin } from '../../utils/printAgentAuth'

export default defineEventHandler(async (event) => {
  if (!rateLimit('enroll:' + clientIp(event), 10, 60_000)) {
    setResponseStatus(event, 429)
    return { ok: false, message: 'too many enrolment attempts, try again in a minute' }
  }
  const body = await readBody(event).catch(() => ({})) || {}
  const code = String(body.code || '').trim()
  if (!code) { setResponseStatus(event, 400); return { ok: false, message: 'code is required' } }

  const res = enrollAgent(code, {
    name: body.name ? String(body.name).slice(0, 80) : undefined,
    hostname: body.hostname ? String(body.hostname).slice(0, 120) : undefined,
    platform: body.platform ? String(body.platform).slice(0, 120) : undefined,
    version: body.version ? String(body.version).slice(0, 40) : undefined
  })
  if ('error' in res) {
    console.warn(`[print-agent] enrolment refused from ${clientIp(event)}: ${res.error}`)
    setResponseStatus(event, 403)
    return { ok: false, message: res.error }
  }
  const config: any = useRuntimeConfig()
  console.log(`[print-agent] enrolled agent #${res.agentId} "${res.name}" (client ${res.clientId}, org ${res.orgId}) from ${clientIp(event)}`)
  return {
    ok: true,
    agentId: res.agentId,
    token: res.token,
    name: res.name,
    clientId: res.clientId,
    orgId: res.orgId,
    instance: { name: config.public?.solutionname || 'LogShip', url: instanceOrigin(event) },
    poll: { waitSeconds: 25, maxJobs: 50, heartbeatSeconds: 60, inlineFileLimit: 300 * 1024 }
  }
})
