/**
 * Standard route wrapper for the SIS listing routes: caller token → handler;
 * on failure one refresh+retry (unless the error came from Amazon), then the
 * app's error shape. Keeps the 11 small routes free of the boilerplate.
 */
import refreshTokenHelper from '../refreshTokenHelper'
import forceLogoutHelper from '../forceLogoutHelper'
import errorHandlingHelper from '../errorHandlingHelper'
import getTokenHelper from '../getTokenHelper'
import { eventFetch, type IdempiereFetch } from './listingStore'

export interface SisRouteCtx { event: any; token: string; f: IdempiereFetch; userLabel: string }

export const userLabelOf = (event: any): string => {
  try {
    const raw = getCookie(event, 'logship_user')
    const user = raw ? JSON.parse(raw) : null
    return String(user?.Name || user?.email || getCookie(event, 'logship_user_id') || 'unknown')
  } catch { return String(getCookie(event, 'logship_user_id') || 'unknown') }
}

export const defineSisHandler = (handler: (ctx: SisRouteCtx) => Promise<any>) => defineEventHandler(async (event) => {
  const run = async (authToken: string | null = null) => {
    const token = String(authToken ?? (await getTokenHelper(event)) ?? '')
    return handler({ event, token, f: eventFetch(event, token), userLabel: userLabelOf(event) })
  }
  try {
    return await run()
  } catch (err: any) {
    if (err?.isAmazonError) return errorHandlingHelper(err?.data ?? err, err?.data ?? err)
    if (Number(err?.status) >= 400 && Number(err?.status) < 500 && err?.message && !err?.data) return { status: Number(err.status), message: err.message }
    try {
      const authToken: any = await refreshTokenHelper(event)
      return await run(authToken)
    } catch (error: any) {
      const data = errorHandlingHelper(err?.data ?? err, error?.data ?? error)
      forceLogoutHelper(event, data)
      return data
    }
  }
})
