// Products v2 grid (staff-only tracking table): the v1 rows plus the product's
// attribute set → tracking mode, GuaranteeDaysMin, and an optional
// `trackingFilter` ('tracked' | 'serial' | 'charge' | 'mhd' | 'both' | 'none').
import refreshTokenHelper from "../../../../utils/refreshTokenHelper"
import forceLogoutHelper from "../../../../utils/forceLogoutHelper"
import errorHandlingHelper from "../../../../utils/errorHandlingHelper"
import { runProductsGrid } from '../../../../utils/productsGrid'
import { ensureTrackingSets, getTrackingSet } from '../../../../utils/attributeTracking'

const handleFunc = async (event: any, authToken: any = null) => {
  const token = authToken ?? await getTokenHelper(event)
  const body = await readBody(event)

  let extraFilter = ''
  const tf = String(body?.trackingFilter ?? '')
  if (tf && tf !== 'all') {
    // Resolving the sets here also bootstraps them on the first visit of the page.
    const sets = await ensureTrackingSets(event, token)
    if (tf === 'tracked') {
      extraFilter = ` AND M_AttributeSet_ID in (${[sets.serial.id, sets.charge.id, sets.mhd.id, sets.both.id].join(',')})`
    } else if (tf === 'none') {
      extraFilter = ' AND M_AttributeSet_ID eq null'
    } else if ((sets as any)[tf]) {
      extraFilter = ` AND M_AttributeSet_ID eq ${(sets as any)[tf].id}`
    }
  }

  return runProductsGrid(event, token, body, {
    extraSelect: ['M_AttributeSet_ID', 'GuaranteeDaysMin'],
    extraFilter,
    mapExtra: async (item, row) => {
      row.attributeSetId = item.M_AttributeSet_ID?.id || ''
      row.attributeSet = item.M_AttributeSet_ID?.identifier || ''
      row.guaranteeDaysMin = Number(item.GuaranteeDaysMin ?? 0) || 0
      const set = await getTrackingSet(event, token, item.M_AttributeSet_ID)   // cached per set id
      row.trackingMode = set?.mode ?? 'none'
      row.trackingFlags = set?.flags ?? { isSerNo: false, isLot: false, isGuaranteeDate: false }
      row.trackingIsCustomSet = !!(set && !set.isLogShip)
    }
  })
}

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