import { string } from 'alga-js'
import refreshTokenHelper from "../../../utils/refreshTokenHelper"
import forceLogoutHelper from "../../../utils/forceLogoutHelper"
import errorHandlingHelper from "../../../utils/errorHandlingHelper"
import fetchHelper from "../../../utils/fetchHelper"
import { resolveMarketplaceId } from "../../../utils/amazonSpApi"

// Returns ONLY the order sources whose marketplace is Amazon, for the settlement
// browser's source picker. Filters in JS on Marketplace.identifier === 'amazon'
// (fallback marketplace id '4', the Amazon entry in the Marketplace reference list).
const handleFunc = async (event: any, authToken: any = null) => {
  let data: any = { records: [] }
  const token = authToken ?? await getTokenHelper(event)

  const res: any = await fetchHelper(
    event,
    `models/c_ordersource?$filter=${string.urlEncode('isActive eq true')}&$orderby=${string.urlEncode('Name asc')}`,
    'GET',
    token,
    null
  )

  const records = (res?.records || [])
    .filter((os: any) => {
      const mp = os?.Marketplace
      const identifier = String(mp?.identifier || '').toLowerCase()
      return identifier === 'amazon' || String(mp?.id) === '4' || String(os?.marketplace) === '4'
    })
    .map((os: any) => ({
      id: os.id,
      name: os.Name || '',
      value: os.Value || '',
      description: os.Description || '',
      marketplaceIdentifier: os?.Marketplace?.identifier || '',
      marketplaceId: resolveMarketplaceId(os?.Marketplace?.identifier, os?.Description),
      hasCreds: !!(os.marketplace_key && os.marketplace_secret && os.marketplace_token)
    }))

  data = { status: 200, records }
  return data
}

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

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