import refreshTokenHelper from "../../../utils/refreshTokenHelper"
import fetchHelper from "../../../utils/fetchHelper"
import getTokenHelper from "../../../utils/getTokenHelper"

export default defineEventHandler(async (event) => {
  const body = await readBody(event)
  const { orderSourceId, ebayEnvironment } = body

  if (!orderSourceId) {
    return { success: false, message: 'Missing order source ID.' }
  }

  // Fetch fresh order source from iDempiere to get the raw marketplace_token
  let orderSource: any = null
  try {
    const token = await getTokenHelper(event)
    orderSource = await fetchHelper(event, `models/c_ordersource/${orderSourceId}`, 'GET', token, null)
  } catch (err: any) {
    try {
      const authToken = await refreshTokenHelper(event)
      orderSource = await fetchHelper(event, `models/c_ordersource/${orderSourceId}`, 'GET', authToken, null)
    } catch (error: any) {
      return { success: false, message: 'Failed to fetch order source.' }
    }
  }

  const rawToken = orderSource?.marketplace_token
  if (!rawToken) {
    return { success: false, message: 'No token found. Please connect your eBay account first.' }
  }

  // Parse token — handle string, object, or truncated JSON
  let tokens: any
  if (typeof rawToken === 'object') {
    tokens = rawToken
  } else if (typeof rawToken === 'string') {
    try {
      tokens = JSON.parse(rawToken)
      if (typeof tokens === 'string') tokens = JSON.parse(tokens)
    } catch (e) {
      // JSON may be truncated due to field length limit — extract access_token via regex
      const accessMatch = rawToken.match(/"access_token"\s*:\s*"([^"]+)"/)
      if (accessMatch) {
        tokens = { access_token: accessMatch[1] }
      } else {
        return { success: false, message: `Token JSON is truncated or invalid. The marketplace_token field in iDempiere may be too small. Current length: ${rawToken.length} chars.` }
      }
    }
  } else {
    return { success: false, message: 'Unexpected token type: ' + typeof rawToken }
  }

  if (!tokens.access_token) {
    return { success: false, message: 'No access_token found in stored credentials.' }
  }

  const env = ebayEnvironment || orderSource?.ebay_environment || 'production'
  const apiBase = env === 'sandbox'
    ? 'https://apiz.sandbox.ebay.com'
    : 'https://apiz.ebay.com'

  try {
    const res: any = await $fetch(`${apiBase}/commerce/identity/v1/user/`, {
      headers: {
        'Authorization': `Bearer ${tokens.access_token}`,
        'Content-Type': 'application/json',
      },
    })

    return {
      success: true,
      message: `Connected as ${res.username || res.userId || 'eBay user'}`,
      username: res.username || res.userId,
      accountType: res.accountType || null,
      email: res.email || null,
      registrationMarketplaceId: res.registrationMarketplaceId || null,
      status: res.status || null,
      individualAccount: res.individualAccount || null,
      businessAccount: res.businessAccount || null,
    }
  } catch (err: any) {
    const status = err?.statusCode || err?.status
    const ebayError = err?.data?.errors?.[0]?.message || err?.data?.error_description || err?.message

    if (status === 401) {
      return { success: false, message: 'Access token expired. Try reconnecting your eBay account.' }
    }

    return { success: false, message: ebayError || 'Failed to connect to eBay API.' }
  }
})
