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 = {}
  const token = authToken ?? await getTokenHelper(event)
  const query = getQuery(event)
  const top = Number(query.top || 200)

  // Cross-org by default (role/tenant scoped by the token); ?organizationId= narrows.
  const filter = query.organizationId ? `$filter=${encodeURIComponent(`AD_Org_ID eq ${Number(query.organizationId)}`)}&` : ''
  const res: any = await fetchHelper(event, `models/m_production?${filter}$orderby=${encodeURIComponent('M_Production_ID desc')}&$top=${top}&$expand=C_OrderLine_ID`, 'GET', token, null)

  const records = (res?.records || []).map((item: any) => {
    const orderLine = item.C_OrderLine_ID
    return {
      id: item.id,
      documentNo: item.DocumentNo,
      name: item.Name || '',
      description: item.Description || '',
      movementDate: item.MovementDate,
      datePromised: item.DatePromised || '',
      productionQty: Number(item.ProductionQty ?? 0),
      productId: item.M_Product_ID?.id || '',
      product: item.M_Product_ID?.identifier || '',
      locatorId: item.M_Locator_ID?.id || '',
      locator: item.M_Locator_ID?.identifier || '',
      bomId: item.PP_Product_BOM_ID?.id || '',
      bom: item.PP_Product_BOM_ID?.identifier || '',
      docStatusId: item.DocStatus?.id || '',
      docStatus: item.DocStatus?.identifier || '',
      isCreated: item.IsCreated?.id === 'Y',
      isComplete: item.IsComplete === true,
      processed: item.Processed === true,
      partnerId: item.C_BPartner_ID?.id || '',
      partner: item.C_BPartner_ID?.identifier || '',
      organizationId: item.AD_Org_ID?.id || '',
      organization: item.AD_Org_ID?.identifier || '',
      orderLineId: orderLine?.id || '',
      orderId: orderLine?.C_Order_ID?.id || '',
      orderDocumentNo: orderLine?.C_Order_ID?.identifier || '',
      created: item.Created
    }
  })

  data = { records, status: 200, message: '' }
  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) {
      data = errorHandlingHelper(err?.data ?? err, error?.data ?? error)
      forceLogoutHelper(event, data)
    }
  }

  return data
})
