import refreshTokenHelper from "../../../utils/refreshTokenHelper"
import forceLogoutHelper from "../../../utils/forceLogoutHelper"
import errorHandlingHelper from "../../../utils/errorHandlingHelper"
import fetchHelper from "../../../utils/fetchHelper"
import { getAmazonAccessToken, resolveMarketplaceId, listSettlementReports } from "../../../utils/amazonSpApi"

// List the available Amazon settlement reports (V2 flat file) for an order source.
// Settlement reports are auto-generated by Amazon per settlement period — they
// populate the period dropdown on the settlement-browser page.
const handleFunc = async (event: any, authToken: any = null) => {
  const token = authToken ?? await getTokenHelper(event)
  const query = getQuery(event)
  const orderSourceId = query.orderSourceId
  const createdSince = query.createdSince ? String(query.createdSince) : undefined
  const nextToken = query.nextToken ? String(query.nextToken) : undefined

  if (!orderSourceId) {
    return { status: 400, message: 'orderSourceId is required' }
  }

  const orderSource: any = await fetchHelper(event, `models/c_ordersource/${orderSourceId}`, 'GET', token, null)
  if (!orderSource) {
    return { status: 404, message: 'Order source not found' }
  }

  const marketplaceIdentifier = String(orderSource?.Marketplace?.identifier || '').toLowerCase()
  const isAmazon = marketplaceIdentifier === 'amazon' || String(orderSource?.Marketplace?.id) === '4' || String(orderSource?.marketplace) === '4'
  if (!isAmazon) {
    return { status: 400, message: `Order source "${orderSource?.Name || orderSourceId}" is not an Amazon marketplace` }
  }

  if (!orderSource?.marketplace_key || !orderSource?.marketplace_secret || !orderSource?.marketplace_token) {
    return { status: 400, message: 'Order source is missing Amazon SP-API credentials (marketplace_key, marketplace_secret, marketplace_token)' }
  }

  const marketplaceId = resolveMarketplaceId(orderSource?.Marketplace?.identifier, orderSource?.Description)
  if (!marketplaceId) {
    return { status: 400, message: 'Could not resolve an Amazon marketplaceId from the order source' }
  }

  const accessToken = await getAmazonAccessToken(
    orderSource.marketplace_key,
    orderSource.marketplace_secret,
    orderSource.marketplace_token
  )

  const { reports, nextToken: next } = await listSettlementReports(accessToken, marketplaceId, { createdSince, nextToken })

  return {
    status: 200,
    orderSourceId: Number(orderSourceId),
    marketplaceId,
    reports,
    nextToken: next
  }
}

export default defineEventHandler(async (event) => {
  let data: any = {}

  try {
    data = await handleFunc(event)
  } catch (err: any) {
    // SP-API errors (e.g. missing Finance & Accounting role) carry a status —
    // surface them verbatim rather than treating them as an auth failure.
    if (err?.status && err?.message) {
      return { status: err.status, message: err.message, spapi: err.spapi }
    }
    try {
      let 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
})
