import { string } from 'alga-js'
import refreshTokenHelper from "../../utils/refreshTokenHelper"
import forceLogoutHelper from "../../utils/forceLogoutHelper"
import errorHandlingHelper from "../../utils/errorHandlingHelper"
import getTokenHelper from "../../utils/getTokenHelper"
import { odataQuote } from "../../utils/odataHelper"

const handleFunc = async (event: any, authToken: any = null) => {
  let data: any = {}
  const token = authToken ?? await getTokenHelper(event)
  const body = await readBody(event)
  const searchTerm = body?.search || ''
  const warehouseId = body?.warehouseId
  const organizationId = body?.organizationId

  if (!searchTerm) {
    throw createError({
      statusCode: 400,
      statusMessage: 'Search term is required'
    })
  }

  // Search by Value (locator code) — quote-escaped, id params coerced
  const safeTerm = odataQuote(searchTerm)
  let filter = `Value eq '${safeTerm}' AND IsActive eq true`
  if (warehouseId) {
    filter += ` AND M_Warehouse_ID eq ${Number(warehouseId)}`
  }
  if (organizationId) {
    filter += ` AND AD_Org_ID eq ${Number(organizationId)}`
  }

  let res: any = await event.context.fetch(
    `models/m_locator?$filter=${string.urlEncode(filter)}`,
    'GET',
    token,
    null
  )

  // If not found with warehouse filter, retry with only org filter
  // This handles cases where product org differs from session warehouse
  if ((!res?.records || res.records.length === 0) && warehouseId && organizationId) {
    let fallbackFilter = `Value eq '${safeTerm}' AND IsActive eq true AND AD_Org_ID eq ${Number(organizationId)}`
    res = await event.context.fetch(
      `models/m_locator?$filter=${string.urlEncode(fallbackFilter)}`,
      'GET',
      token,
      null
    )
  }

  if (res?.records && res.records.length > 0) {
    const locator = res.records[0]
    data = {
      id: locator.id,
      code: locator.Value || locator.identifier || locator.Name,
      Value: locator.Value,
      Name: locator.Name,
      isDefault: locator.IsDefault || false,
      warehouseId: locator.M_Warehouse_ID?.id || locator.M_Warehouse_ID
    }
  } else {
    throw createError({
      statusCode: 404,
      statusMessage: 'Locator not found'
    })
  }

  return data
}

export default defineEventHandler(async (event) => {
  // Auth-only retry: a business 404 no longer triggers a token refresh.
  return await withAuthRetry(event, handleFunc)
})
