// Lists the AD_Users attached to a merchant C_BPartner, for the "send login data" action on
// the partner edit page. Only users linked to THIS bpartner via C_BPartner_ID are returned
// (equivalent to models/c_bpartner/{id}?$expand=ad_user) — we deliberately do NOT pull every
// user of the merchant's org, otherwise unrelated order/contact users from across the org show up.
//
// NOTE: returns each user's cleartext Password (this iDempiere instance stores/returns it on
// the full record — $select strips it, a full fetch includes it). Admin-only surface.
import refreshTokenHelper from "../../../utils/refreshTokenHelper"
import forceLogoutHelper from "../../../utils/forceLogoutHelper"
import errorHandlingHelper from "../../../utils/errorHandlingHelper"
import fetchHelper from "../../../utils/fetchHelper"

const handleFunc = async (event: any, authToken: any = null) => {
  let data: any = { users: [] }
  const token = authToken ?? await getTokenHelper(event)
  const query = getQuery(event)
  const bpartnerId = query?.bpartnerId

  if (!bpartnerId) return data

  const byId: Record<string, any> = {}
  const addUsers = (records: any[]) => {
    for (const u of records || []) {
      if (!u?.id) continue
      byId[u.id] = {
        id: u.id,
        // iDempiere login name is AD_User.Name; fall back to Value.
        username: u.Name || u.Value || '',
        name: u.Name || '',
        // Greeting source: prefer Description, fall back to Name (see send-credentials).
        description: u.Description || '',
        value: u.Value || '',
        email: u.EMail || '',
        password: u.Password || '',
        hasPassword: !!u.Password,
        isLoginUser: !!u.Password,
      }
    }
  }

  // Only the users attached to this bpartner via C_BPartner_ID (full record → Password incl.).
  const res1: any = await fetchHelper(event, `models/ad_user?$filter=C_BPartner_ID eq ${bpartnerId} and IsActive eq true&$top=200`, 'GET', token, null)
  addUsers(res1?.records || [])

  data = { users: Object.values(byId), status: 200, message: '' }
  return data
}

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