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"

// Returns ONLY the order sources whose marketplace is eBay, for the payout
// browser's source picker. Filters in JS on Marketplace.identifier === 'ebay'
// (fallback marketplace id '5', the eBay 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 === 'ebay' || String(mp?.id) === '5' || String(os?.marketplace) === '5'
    })
    .map((os: any) => {
      const clientId = os.SHOPWARE_KEY || os.marketplace_key
      const clientSecret = os.SHOPWARE_SECRET || os.marketplace_secret
      return {
        id: os.id,
        name: os.Name || '',
        value: os.Value || '',
        description: os.Description || '',
        marketplaceIdentifier: os?.Marketplace?.identifier || '',
        marketplaceId: os?.Marketplace?.id ?? null,
        environment: os.ebay_environment || 'production',
        hasCreds: !!(clientId && clientSecret),
        connected: !!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
})
