import refreshTokenHelper from "../../../utils/refreshTokenHelper"
import forceLogoutHelper from "../../../utils/forceLogoutHelper"
import errorHandlingHelper from "../../../utils/errorHandlingHelper"
import { flushOutbox } from "../../../utils/listings/outbox"
import { eventFetch } from "../../../utils/listings/listingStore"

// SIS "Send now": flush the listing outbox immediately (optionally one order
// source). Runs with the caller's token so UpdatedBy on the rows is the user.
// Bounded to 25 s so the request stays well under nginx's 60 s; whatever is
// left is picked up by the timer (server/plugins/listing-outbox-flush.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) || undefined
  const summary = await flushOutbox({ orderSourceId, trigger: 'manual', fetch: eventFetch(event, token), maxRunMs: 25_000 })
  return { status: 200, ...summary }
}

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