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

const handleFunc = async (event: any, authToken: any = null) => {
  let data: any = {}
  const config = useRuntimeConfig()
  const token = authToken ?? await getTokenHelper(event)
  const organizationId = getCookie(event, 'logship_organization_id')
  const query = getQuery(event)

  // Get organization filter from query params
  const orgId = query.org_id

  // If no organization is specified, return empty result
  if (!orgId) {
    return { records: [], message: 'Please select an organization' }
  }

  // Build filter with organization
  const baseFilter = `MovementQty lt 0 AND isActive eq true AND AD_Org_ID eq ${orgId}`

  // Fetch transactions (outbound movements only - negative MovementQty)
  // This captures all customer shipments, sales, and outbound movements
  const res: any = await fetchHelper(
    event,
    `models/m_transaction?$filter=${string.urlEncode(baseFilter)}&$orderby=${string.urlEncode('MovementDate desc')}&$top=2000`,
    'GET',
    token,
    null
  )

  if(res?.records) {
    // Get unique product IDs from all transactions
    const productIds = new Set()
    res.records.forEach((transaction: any) => {
      const productId = transaction.M_Product_ID?.id || transaction.m_product_id?.id
      if (productId) {
        productIds.add(productId)
      }
    })

    // Fetch product details with storage for each unique product
    const productDataMap = new Map()
    let debugLogged = false
    for (const productId of productIds) {
      try {
        const productRes: any = await fetchHelper(
          event,
          `models/m_product/${productId}?$expand=M_Storage`,
          'GET',
          token,
          null
        )
        if (productRes) {
          productDataMap.set(productId, productRes)
          // Debug log first product
          if (!debugLogged) {
            console.log('=== PRODUCT STORAGE DEBUG ===')
            console.log('Product ID:', productId)
            console.log('Product Name:', productRes.Name || productRes.identifier)
            console.log('M_Storage:', productRes.M_Storage || productRes.m_storage || 'NOT FOUND')
            if (productRes.M_Storage || productRes.m_storage) {
              const storage = productRes.M_Storage || productRes.m_storage
              console.log('Storage length:', storage.length)
              if (storage.length > 0) {
                console.log('First storage:', storage[0])
              }
            }
            debugLogged = true
          }
        }
      } catch (err) {
        console.error(`Error fetching product ${productId}:`, err)
      }
    }

    // Merge product data into transactions
    res.records.forEach((transaction: any) => {
      const productId = transaction.M_Product_ID?.id || transaction.m_product_id?.id
      if (productId && productDataMap.has(productId)) {
        const productData = productDataMap.get(productId)
        // Add storage data to the transaction
        if (transaction.M_Product_ID) {
          transaction.M_Product_ID.M_Storage = productData.M_Storage || []
        }
        if (transaction.m_product_id) {
          transaction.m_product_id.m_storage = productData.M_Storage || productData.m_storage || []
        }
      }
    })

    data = res
  }

  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
})
