/**
 * GET /api/mail/lead-emails/message?leadId=<AD_User_ID>&account=<index>&folder=<path>&uid=<uid>   (IMAP)
 * GET /api/mail/lead-emails/message?leadId=<AD_User_ID>&account=archive&uid=<archive id>          (mailpiler)
 * Partner mode (admin roles): `partnerId=<C_BPartner_ID>&address=<one of its addresses>` instead of `leadId`.
 * Content of one e-mail of the lead's history: { status, message: { html, text,
 * from, to, cc, attachments, … } }. The message must involve the lead's address
 * (checked server-side), otherwise 404. Staff only. Never throws to the client.
 */
import { gateFromEvent } from '../../../utils/chatAccess'
import { listMailAccounts, fetchMessage } from '../../../utils/mail/leadMailbox'
import { fetchArchiveMessage } from '../../../utils/mail/mailArchive'
import { resolveMailTarget } from '../../../utils/mail/leadEmailAddress'

export default defineEventHandler(async (event) => {
  let token = ''
  try { token = (await gateFromEvent(event)).token } catch (err: any) { return { status: err?.statusCode || 403, message: 'Forbidden' } }
  const q = getQuery(event)
  const leadId = Number(q.leadId) || 0
  const partnerId = Number(q.partnerId) || 0
  const isArchive = String(q.account) === 'archive'
  const index = Number(q.account)
  const folder = String(q.folder || '')
  const uid = Number(q.uid) || 0
  if ((!leadId && !partnerId) || !uid) return { status: 400, message: 'Missing parameters' }
  if (!isArchive && (!Number.isInteger(index) || !listMailAccounts()[index] || !folder)) return { status: 400, message: 'Missing parameters' }
  try {
    const { email } = await resolveMailTarget(event, q, token)
    if (!email) return { status: 404, message: 'No e-mail address' }
    const started = Date.now()
    const message = isArchive ? await fetchArchiveMessage(uid, email) : await fetchMessage(index, folder, uid, email)
    if (!message) return { status: 404, message: 'Message not found' }
    return { status: 200, message, ms: Date.now() - started }
  } catch (err: any) {
    if (err?.statusCode === 403) return { status: 403, message: 'Forbidden' }
    console.warn('[lead-emails] message failed:', err?.message || err)
    return { status: 502, message: err?.message || 'Mailbox unavailable' }
  }
})
