import getTokenHelper from "../../../utils/getTokenHelper"
import refreshTokenHelper from "../../../utils/refreshTokenHelper"
import errorHandlingHelper from "../../../utils/errorHandlingHelper"
import { resolveMerchantPartner, resolveOwnUserId } from "../../../utils/merchantPartner"
import { EMAIL_FIELDS } from "../../../utils/emailVerification"
import { cancelActivePending } from "../../../utils/emailVerifyDb"

/**
 * Cancels an outstanding (unconfirmed) e-mail change — body { fieldKey }.
 * The target is resolved from the caller's own identity, so a merchant can
 * only ever cancel pending changes on their own ad_user row / their own
 * company's c_bpartner row.
 */
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 body = await readBody(event)

  const fieldKey = String(body?.fieldKey || '')
  const def = EMAIL_FIELDS[fieldKey]
  if (!def) return { status: 400, message: 'Unknown e-mail field' }

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

  let targetId: number
  if (def.kind === 'aduser') {
    targetId = userId
  } else {
    const partner = await resolveMerchantPartner(event, token)
    if (!partner) return { status: 404, message: 'No business partner is linked to this account' }
    targetId = partner.id
  }

  cancelActivePending(def.kind, targetId, fieldKey)
  return { status: 200 }
}

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
})
