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"

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

  const organizationId = query.organizationId || getCookie(event, 'logship_organization_id')
  const dateFrom = query.dateFrom || ''
  const dateTo = query.dateTo || ''
  const partnerId = query.partnerId || ''

  const filters: string[] = [
    `IsSOTrx eq true`,
    `IsActive eq true`,
    `DocStatus eq 'CO'`,
    `IsInvoiced eq false`
  ]

  if(organizationId) {
    filters.push(`AD_Org_ID eq ${organizationId}`)
  }

  if(dateFrom) {
    filters.push(`DateOrdered ge '${dateFrom}'`)
  }

  if(dateTo) {
    filters.push(`DateOrdered le '${dateTo}'`)
  }

  if(partnerId) {
    filters.push(`C_BPartner_ID eq ${partnerId}`)
  }

  const filterString = filters.join(' AND ')
  const url = `models/c_order?$filter=${string.urlEncode(filterString)}&$orderby=${string.urlEncode('DateOrdered desc')}&$top=500`

  const res: any = await fetchHelper(event, url, 'GET', token, null)

  if(res) {
    const records = (res.records || []).map((item: any) => ({
      id: item.id,
      uid: item.uid,
      documentNo: item.DocumentNo,
      dateOrdered: item.DateOrdered,
      dateAcct: item.DateAcct,
      datePromised: item.DatePromised,
      partner: item.C_BPartner_ID?.identifier || '',
      partnerId: item.C_BPartner_ID?.id || '',
      currency: item.C_Currency_ID?.identifier || '',
      currencyId: item.C_Currency_ID?.id || '',
      grandTotal: item.GrandTotal,
      totalLines: item.TotalLines,
      description: item.Description || '',
      docStatus: item.DocStatus?.identifier || item.DocStatus || '',
      isDelivered: item.IsDelivered,
      isInvoiced: item.IsInvoiced,
      organization: item.AD_Org_ID?.identifier || '',
      organizationId: item.AD_Org_ID?.id || ''
    }))

    data = {
      status: 200,
      message: '',
      records,
      rowCount: res['row-count'] || records.length
    }
  }

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

  return data
})
