/**
 * GET /api/offers/software-catalog
 * The software-offer catalog (packages, feature matrix, add-ons) read from the
 * iDempiere tables CUST_SoftwarePlan / CUST_SoftwareCatalogItem — fail-soft to
 * the code defaults (see server/utils/offers/softwareCatalog.ts). `?refresh=1`
 * bypasses the 5-min cache. Token gate only (every staff user may read it).
 */
import refreshTokenHelper from '../../../utils/refreshTokenHelper'
import errorHandlingHelper from '../../../utils/errorHandlingHelper'
import forceLogoutHelper from '../../../utils/forceLogoutHelper'
import { loadSoftwareCatalog } from '../../../utils/offers/softwareCatalog'

const handleFunc = async (event: any, authToken: string | null = null) => {
  const token = authToken ?? await getTokenHelper(event)
  if (!token) return { status: 401, message: 'Not authenticated' }
  const force = String(getQuery(event)?.refresh || '') === '1'
  const catalog = await loadSoftwareCatalog(event, token, force)
  return { status: 200, catalog }
}

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)
      forceLogoutHelper(event, data)
    }
  }
  return data
})
