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

/**
 * Sales-rep selector source.
 *
 * Strategy: query c_bpartner where the partner is flagged Sales Rep + Employee + Active,
 * then $expand AD_User (also active). Flatten the nested AD_User arrays into a single
 * list so the SelectBox receives plain { id, Name } records — id is the AD_User_ID
 * which is what SalesRep_ID stores on c_bpartner / c_order / etc.
 */
const handleFunc = async (event: any, authToken: any = null) => {
  let data: any = { records: [] }
  const token = authToken ?? await getTokenHelper(event)

  const filter  = string.urlEncode('IsSalesRep eq true AND IsEmployee eq true AND IsActive eq true')
  const expand  = string.urlEncode('AD_User($filter=IsActive eq true)')

  const res: any = await event.context.fetch(`models/c_bpartner?$filter=${filter}&$expand=${expand}`, 'GET', token, null)

  // Flatten c_bpartner.AD_User[] → flat AD_User list
  const seen = new Set<number>()
  const flat: any[] = []
  if (res?.records) {
    for (const bp of res.records) {
      const users = Array.isArray(bp.AD_User) ? bp.AD_User : []
      for (const u of users) {
        if (!u?.id || seen.has(u.id)) continue
        seen.add(u.id)
        flat.push({
          id: u.id,
          Name: u.Name || u.Value || `User #${u.id}`,
          // pass through useful extras for the UI
          EMail: u.EMail || '',
          BPartnerName: bp.Name || '',
          BPartnerId: bp.id
        })
      }
    }
  }

  data = {
    'records-size': flat.length,
    'row-count': flat.length,
    records: flat
  }
  return data
}

export default defineEventHandler(async (event) => {
  let data: any = {}

  try {
    data = await handleFunc(event)
  } catch(err: any) {
    try {
      let 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
})
