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"
import { ensureLocator, lookupShape } from "../../utils/locatorCatalog"

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,
      created: false
    }
  } else {
    // Not in the org yet: create it from the master-org template (spaces / X-Y-Z forms
    // tolerated); codes unknown to the master org stay a 404.
    const ensured = organizationId
      ? await ensureLocator(event, token, { orgId: Number(organizationId), warehouseId: Number(warehouseId) || null, code: searchTerm })
      : null
    if (!ensured) {
      throw createError({
        statusCode: 404,
        statusMessage: 'Locator not found'
      })
    }
    data = lookupShape(ensured.locator, ensured.created)
  }

  return data
}

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