import getTokenHelper from "../../utils/getTokenHelper"
import refreshTokenHelper from "../../utils/refreshTokenHelper"
import errorHandlingHelper from "../../utils/errorHandlingHelper"
import fetchHelper from "../../utils/fetchHelper"
import { resolveMerchantPartner, pickMerchantFields, resolveOwnUserId } from "../../utils/merchantPartner"
import { getActivePendingFor } from "../../utils/emailVerifyDb"

/**
 * Merchant self-service read of the manageable e-mail addresses:
 * the whitelisted fields of the own company partner (C_BPartner) plus the
 * caller's own ad_user e-mail. Uses the iDempiere service token internally
 * (limited roles cannot read c_bpartner / ad_user) but returns ONLY the
 * whitelisted projection — never a raw record.
 *
 * Also returns `pending`: e-mail changes awaiting confirmation (the link
 * mailed to the new address has not been clicked yet), keyed by fieldKey.
 * The active value stays the old one until confirmation.
 */
const handleFunc = async (event: any, authToken: string | null = null) => {
  const config = useRuntimeConfig()
  const serviceToken = (config.api as any)?.idempieretoken
  const token = serviceToken || authToken || await getTokenHelper(event)

  const userId = resolveOwnUserId(event)
  if (!userId) {
    return { status: 401, message: 'No user session' }
  }

  const partner = await resolveMerchantPartner(event, token)

  let userEmail = ''
  try {
    const userRes: any = await fetchHelper(event, `models/ad_user/${userId}?$select=EMail`, 'GET', token, null)
    userEmail = userRes?.EMail || ''
  } catch (e) { /* non-fatal — the partner fields still render */ }

  return {
    status: 200,
    companyName: partner?.record?.Name || '',
    userEmail,
    ...(partner ? pickMerchantFields(partner.record) : {}),
    pending: getActivePendingFor(userId, partner?.id ?? null)
  }
}

export default defineEventHandler(async (event) => {
  let data: any = {}

  try {
    data = await handleFunc(event)
  } catch (err: any) {
    try {
      const authToken: any = await refreshTokenHelper(event)
      data = await handleFunc(event, authToken)
    } catch (error: any) {
      data = errorHandlingHelper(err?.data ?? err, error?.data ?? error)
    }
  }

  return data
})
