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

// List open purchase orders (DocStatus = 'CO') optionally scoped to an
// organization. Used by the mobile receive page to let the user pick a PO
// and pre-fill a goods receipt from its lines.
const handleFunc = async (event: any, authToken: any = null) => {
  const token = authToken ?? await getTokenHelper(event)
  const query = getQuery(event)
  const orgId = query?.organizationId ? Number(query.organizationId) : null
  const limit = Number(query?.limit ?? 100)

  const parts: string[] = [
    "IsSOTrx eq false",
    "DocStatus eq 'CO'",
    "IsActive eq true"
  ]
  if (orgId) parts.push(`AD_Org_ID eq ${orgId}`)

  const filter = parts.join(' AND ')
  const res: any = await fetchHelper(
    event,
    `models/c_order?$filter=${string.urlEncode(filter)}&$orderby=${string.urlEncode('datepromised asc, c_order_id desc')}&$top=${limit}`,
    'GET', token, null
  )

  const records = (res?.records ?? []).map((o: any) => ({
    id: o.id,
    documentNo: o.DocumentNo,
    dateOrdered: o.DateOrdered,
    datePromised: o.DatePromised,
    grandTotal: Number(o.GrandTotal || 0),
    poReference: o.POReference || '',
    description: o.Description || '',
    partner: {
      id: o.C_BPartner_ID?.id || null,
      name: o.C_BPartner_ID?.identifier || ''
    },
    partnerLocation: {
      id: o.C_BPartner_Location_ID?.id || null
    },
    org: {
      id: o.AD_Org_ID?.id || null,
      name: o.AD_Org_ID?.identifier || ''
    },
    warehouse: {
      id: o.M_Warehouse_ID?.id || null,
      name: o.M_Warehouse_ID?.identifier || ''
    }
  }))

  return { records, rowCount: res?.['row-count'] ?? records.length }
}

export default defineEventHandler(async (event) => {
  // Auth-only retry; errors are THROWN (the old wrapper returned the error
  // object as an HTTP 200 body, so the client showed an empty PO list on
  // backend failures with no error signal).
  return await withAuthRetry(event, handleFunc)
})
