import { string } from 'alga-js'
import refreshTokenHelper from '../../utils/refreshTokenHelper'
import forceLogoutHelper from '../../utils/forceLogoutHelper'
import errorHandlingHelper from '../../utils/errorHandlingHelper'
import getTokenHelper from '../../utils/getTokenHelper'

// iDempiere already scopes ad_org reads to whatever the bearer token's role
// can access — no AD_Role_ID join needed. Return a trimmed list (id + name)
// so the mobile org pickers can render it directly.
const handleFunc = async (event: any, authToken: any = null) => {
  const token = authToken ?? await getTokenHelper(event)

  const filter = 'IsActive eq true'
  const orderby = 'Name asc'
  const select = 'AD_Org_ID,Name'
  const url = `models/ad_org?$filter=${string.urlEncode(filter)}&$orderby=${string.urlEncode(orderby)}&$select=${select}&$top=500`

  const res: any = await event.context.fetch(url, 'GET', token, null)

  const records: any[] = Array.isArray(res?.records) ? res.records : []
  return records
    .map((r: any) => ({ id: r.id ?? r.AD_Org_ID, name: r.Name || '' }))
    .filter((o: any) => o.id !== undefined && o.id !== null && o.name)
}

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) {
      const errData = errorHandlingHelper(err?.data ?? err, error?.data ?? error)
      forceLogoutHelper(event, errData)
      throw createError({
        statusCode: err?.statusCode || 500,
        statusMessage: err?.statusMessage || 'Error loading organizations',
        data: errData
      })
    }
  }

  return data
})
