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

const handleFunc = async (event: any, authToken: any = null) => {
  const token = authToken ?? await getTokenHelper(event)
  const query = getQuery(event)

  const limit: number = query?.limit ?? 100
  const offset: number = query?.offset ?? 0
  const filter: string = query?.filter ?? ''
  const openOnly: string = query?.openOnly ?? ''
  const openShipments: string = query?.openShipments ?? ''
  const nameFilter: string = query?.name ?? ''
  const trackingNoFilter: string = query?.trackingNo ?? ''

  let filterString = string.urlEncode('IsSOTrx eq true')

  if (filter) {
    filterString += string.urlEncode(' AND ') + string.urlEncode(filter)
  }

  if (nameFilter) {
    filterString += string.urlEncode(' AND ') + string.urlEncode(`contains(ship_name,'${nameFilter}')`)
  }

  if (trackingNoFilter) {
    filterString += string.urlEncode(' AND ') + string.urlEncode(`contains(TrackingNo,'${trackingNoFilter}')`)
  }

  if (openOnly === 'true') {
    filterString += string.urlEncode(' AND ') + string.urlEncode(`has_shipment eq 'N' AND (DocStatus eq 'CO' or DocStatus eq 'DR' or DocStatus eq 'IP')`)
  }

  if (openShipments === 'true') {
    filterString += string.urlEncode(' AND ') + string.urlEncode(`has_shipment eq 'Y' AND IsCommissioned eq false AND (DocStatus eq 'CO' or DocStatus eq 'DR' or DocStatus eq 'IP')`)
  }

  const res: any = await event.context.fetch(
    `models/v_orders_summary?$filter=${filterString}&$orderby=${string.urlEncode('Created desc')}&$top=${limit}&$skip=${offset}`,
    'GET', token, null
  )

  return res || {}
}

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

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