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 ')
  // Lines are child-expanded (QtyOrdered/QtyDelivered only) so the picker can
  // show per-PO item totals without a request per PO.
  const res: any = await fetchHelper(
    event,
    `models/c_order?$filter=${string.urlEncode(filter)}&$orderby=${string.urlEncode('datepromised asc, c_order_id desc')}&$top=${limit}&$expand=${string.urlEncode('c_orderline($select=QtyOrdered,QtyDelivered)')}`,
    'GET', token, null
  )

  const records = (res?.records ?? []).map((o: any) => {
    const lines = Array.isArray(o.c_orderline) ? o.c_orderline : []
    let itemsTotal = 0
    let itemsOpen = 0
    for (const l of lines) {
      const ordered = Number(l.QtyOrdered || 0)
      const delivered = Number(l.QtyDelivered || 0)
      itemsTotal += ordered
      itemsOpen += Math.max(0, ordered - delivered)
    }
    return {
      id: o.id,
      documentNo: o.DocumentNo,
      dateOrdered: o.DateOrdered,
      datePromised: o.DatePromised,
      grandTotal: Number(o.GrandTotal || 0),
      poReference: o.POReference || '',
      description: o.Description || '',
      lineCount: lines.length,
      itemsTotal,
      itemsOpen,
      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)
})
