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

/**
 * List OrderSources with DPD_USE_CUSTOM=true, including organization info.
 * Used by the manual-label page to let the user pick which DPD account
 * should be billed for a one-off label.
 *
 * Response shape: { records: [{ id, name, orgId, orgName, label }] }
 */
const handleFunc = async (event: any, authToken: any = null) => {
  const token = authToken ?? await getTokenHelper(event)
  const filter = `DPD_USE_CUSTOM eq true`
  const res: any = await fetchHelper(
    event,
    `models/c_ordersource?$filter=${string.urlEncode(filter)}&$top=200`,
    'GET',
    token,
    null
  )

  // Filter inactive in JS (OData boolean filters on IsActive can interact
  // oddly with the DPD_USE_CUSTOM filter on iDempiere). AD_Org_ID is returned
  // as a nested {id, identifier} object by default — no $expand needed.
  const records = (res?.records || [])
    .filter((r: any) => r?.IsActive !== false)
    .map((r: any) => ({
      id: r.id,
      name: r.Name || r.Value || '',
      orgId: r?.AD_Org_ID?.id ?? null,
      orgName: r?.AD_Org_ID?.identifier ?? '',
      // Friendly display label: "<Org> — <OrderSource Name>"
      label: [r?.AD_Org_ID?.identifier, (r.Name || r.Value || '')].filter(Boolean).join(' — ')
    }))

  return { records, status: 200 }
}

export default defineEventHandler(async (event) => {
  let data: any = { records: [] }
  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
})
