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"

const handleFunc = async (event: any, authToken: any = null) => {
  let data: any = { records: [], 'row-count': 0 }
  const token = authToken ?? await getTokenHelper(event)
  const query = getQuery(event)
  const orgId = query?.org_id as string

  if (!orgId) {
    return { status: 400, message: 'Organization ID is required', records: [], 'row-count': 0 }
  }

  // Build filter for products owned by organization
  const orgFilter = string.urlEncode(`AD_Org_ID eq ${orgId} and IsActive eq true`)

  // Fetch products with storage data
  const res: any = await fetchHelper(
    event,
    `models/m_product?$select=${string.urlEncode('M_Product_ID,Name,SKU,UPC,Value,mpn,AD_Org_ID')}&$expand=M_Storage,AD_Org_ID($select=Name)&$filter=${orgFilter}&$orderby=${string.urlEncode('Name asc')}&$top=5000`,
    'GET',
    token,
    null
  )

  if (res?.records) {
    // Transform records to include aggregated QtyOnHand
    const transformedRecords = res.records.map((product: any) => {
      const storages = product?.M_Storage || []
      let totalQtyOnHand = 0

      if (Array.isArray(storages)) {
        for (const storage of storages) {
          totalQtyOnHand += Number(storage?.QtyOnHand || 0)
        }
      }

      return {
        id: product.id || product.M_Product_ID,
        productId: product.M_Product_ID,
        name: product.Name || '',
        sku: product.SKU || '',
        ean: product.UPC || '',
        value: product.Value || '',
        mpn: product.mpn || '',
        qtyOnHand: totalQtyOnHand,
        organization: product.AD_Org_ID?.Name || '',
        organizationId: product.AD_Org_ID?.id || orgId
      }
    })

    data = {
      status: 200,
      records: transformedRecords,
      'row-count': transformedRecords.length
    }
  }

  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: any) {
      data = errorHandlingHelper(err?.data ?? err, error?.data ?? error)
      forceLogoutHelper(event, data)
    }
  }

  return data
})