/**
 * Shared route wrapper for the warehouse-layouts routes: standard try → refresh token →
 * retry → errorHandlingHelper pattern (see CLAUDE.md "Server API Route Pattern").
 * Lives in server/utils so Nitro never mounts it as a route.
 */
import refreshTokenHelper from './refreshTokenHelper'
import forceLogoutHelper from './forceLogoutHelper'
import errorHandlingHelper from './errorHandlingHelper'
import getTokenHelper from './getTokenHelper'

export type Handler = (event: any, token: string) => Promise<any>

export const withIdempiere = (handler: Handler) => defineEventHandler(async (event) => {
  let data: any = {}
  try {
    data = await handler(event, await getTokenHelper(event))
  } catch (err: any) {
    try {
      const authToken: any = await refreshTokenHelper(event)
      data = await handler(event, authToken)
    } catch (error: any) {
      data = errorHandlingHelper(err?.data ?? err, error?.data ?? error)
      forceLogoutHelper(event, data)
    }
  }
  return data
})
