import refreshTokenHelper from "../../../../utils/refreshTokenHelper"
import forceLogoutHelper from "../../../../utils/forceLogoutHelper"
import errorHandlingHelper from "../../../../utils/errorHandlingHelper"
import { buildImportPreview } from "../../../../utils/listings/importer"
import { eventFetch } from "../../../../utils/listings/listingStore"

// POST /api/sales/sis/listings/import-preview  { orderSourceId, refresh? }
// What is listed on the marketplace right now, matched to products and flagged
// with already-imported listings. Answers 202 while Amazon's report is still
// generating (same polling contract as the old listings.get.ts).
const handleFunc = async (event: any, authToken: any = null) => {
  const token = authToken ?? await getTokenHelper(event)
  const body = await readBody(event).catch(() => ({}))
  const orderSourceId = Number(body?.orderSourceId)
  if (!orderSourceId) return { status: 400, message: 'orderSourceId is required' }
  const f = eventFetch(event, token)
  const orderSource: any = await f(`models/c_ordersource/${orderSourceId}`)
  if (!orderSource?.id) return { status: 404, message: 'Order source not found' }
  const preview = await buildImportPreview(event, token, f, orderSource, { forceRefresh: body?.refresh === true || body?.refresh === 1 || body?.refresh === '1' })
  if (preview.pending) return { status: 202, pending: true, orderSourceId, startedAt: preview.startedAt, message: 'Amazon is still generating the listings report' }
  return { status: 200, orderSourceId, ...preview }
}

export default defineEventHandler(async (event) => {
  let data: any = {}
  try {
    data = await handleFunc(event)
  } catch (err: any) {
    if (err?.isAmazonError) return errorHandlingHelper(err?.data ?? err, err?.data ?? err)
    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
})
