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"

/**
 * Look up a product by exact Value match
 * Used for CSV import to match SKUs to products
 */
const handleFunc = async (event: any, authToken: any = null) => {
  let data: any = { records: [] }
  const token = authToken ?? await getTokenHelper(event)
  const query = getQuery(event)
  const value = query.value || ''

  if (!value) {
    return data
  }

  // Escape single quotes in value
  const escapedValue = (value as string).replace(/'/g, "''")

  console.log('[by-value] Looking up product:', escapedValue)

  // Try Value → SKU → mpn → UPC in order for a given (quote-escaped) term
  const lookupChain = async (term: string) => {
    let chainRes: any = null
    for (const field of ['Value', 'SKU', 'mpn', 'UPC']) {
      const searchFilter = `${field} eq '${term}' and isActive eq true`
      const apiUrl = `models/m_product?$filter=${string.urlEncode(searchFilter)}&$select=m_product_id,Value,Name,SKU,mpn,UPC&$top=1`
      console.log(`[by-value] Trying ${field} field for "${term}"...`)
      chainRes = await fetchHelper(event, apiUrl, 'GET', token, null)
      if (chainRes?.records?.length) break
    }
    return chainRes
  }

  let res: any = await lookupChain(escapedValue)

  // No exact match anywhere → retry the chain with separators stripped, so a
  // printed barcode "PZN-15821889" / "PZN - 15821889" finds stored "PZN15821889".
  if (!res?.records?.length) {
    const strippedValue = escapedValue.replace(/[\s-]+/g, '')
    if (strippedValue && strippedValue !== escapedValue) {
      console.log('[by-value] No exact match, retrying with separators stripped:', strippedValue)
      res = await lookupChain(strippedValue)
    }
  }

  console.log('[by-value] Response records:', res?.records?.length || 0)
  if (res?.records?.length > 0) {
    console.log('[by-value] Found:', res.records[0].Value, res.records[0].Name)
  } else {
    console.log('[by-value] No product found for:', escapedValue)
  }

  if (res?.records) {
    // Map m_product_id to id for consistency
    data.records = res.records.map((r: any) => ({
      id: r.m_product_id || r.M_Product_ID || r.id,
      Value: r.Value,
      Name: r.Name,
      SKU: r.SKU,
      MPN: r.mpn,
      UPC: r.UPC
    }))
  }

  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
})
