import refreshTokenHelper from "../../../utils/refreshTokenHelper"
import forceLogoutHelper from "../../../utils/forceLogoutHelper"
import errorHandlingHelper from "../../../utils/errorHandlingHelper"
import { listChanges, eventFetch, type ChangeStatus } from "../../../utils/listings/listingStore"

// GET /api/sales/sms/changes?orderSourceId=&listingId=&status=queued,sent&top=
// Change history / outbox view (CUST_MarketplaceListingChange), newest first.
const handleFunc = async (event: any, authToken: any = null) => {
  const token = authToken ?? await getTokenHelper(event)
  const q = getQuery(event)
  const orderSourceId = Number(q.orderSourceId) || undefined
  const listingId = Number(q.listingId) || undefined
  const status = String(q.status || '').split(',').map(s => s.trim()).filter(Boolean) as ChangeStatus[]
  const top = Math.min(2000, Math.max(1, Number(q.top) || 500))
  if (!orderSourceId && !listingId) return { status: 400, message: 'orderSourceId or listingId is required' }
  const rows = await listChanges(eventFetch(event, token), { orderSourceId, listingId, ...(status.length ? { status } : {}) }, top)
  rows.sort((a, b) => (b.created || '').localeCompare(a.created || '') || b.id - a.id)
  const counts: Record<string, number> = {}
  for (const r of rows) counts[r.changeStatus] = (counts[r.changeStatus] || 0) + 1
  return { status: 200, rows, counts, total: rows.length }
}

export default defineEventHandler(async (event) => {
  let data: any = {}
  try {
    data = await handleFunc(event)
  } catch (err: any) {
    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
})
