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) => {
  const data: any = {
    partner: null,
    partnerLocation: null,
    paymentTerm: null,
    docType: null,
    priceList: null
  }
  const token = authToken ?? await getTokenHelper(event)

  const partnerRes: any = await fetchHelper(
    event,
    `models/c_bpartner?$filter=${string.urlEncode("Name eq 'Dummy' AND IsVendor eq true AND IsActive eq true")}&$top=1`,
    'GET',
    token,
    null
  )
  const partner = partnerRes?.records?.[0]
  if (partner?.id) {
    data.partner = { id: partner.id, identifier: partner.Name }
    if (partner.C_PaymentTerm_ID?.id) {
      data.paymentTerm = { id: partner.C_PaymentTerm_ID.id, identifier: partner.C_PaymentTerm_ID.identifier || '' }
    }

    const locRes: any = await fetchHelper(
      event,
      `models/c_bpartner_location?$filter=${string.urlEncode('C_BPartner_ID eq ' + partner.id + ' AND IsActive eq true')}&$orderby=${string.urlEncode('c_bpartner_location_id asc')}&$top=1`,
      'GET',
      token,
      null
    )
    const loc = locRes?.records?.[0]
    if (loc?.id) {
      data.partnerLocation = { id: loc.id, identifier: loc.Name || '' }
    }
  }

  // Pinned: limited-role POs always use doctype 1000016 ("Purchase Order").
  // Used as both C_DocType_ID and C_DocTypeTarget_ID on the order.
  const DOCTYPE_ID = 1000016
  const docRes: any = await fetchHelper(
    event,
    `models/c_doctype/${DOCTYPE_ID}`,
    'GET',
    token,
    null
  )
  data.docType = {
    id: DOCTYPE_ID,
    identifier: docRes?.Name || 'Purchase Order'
  }

  // Pinned: derive the purchase price list from the env-configured version
  // (PURCHASE_PRICE_LIST_VERSION_ID, defaults to 1000004) so every limited-role
  // PO uses the same procurement pricing, regardless of org.
  const PRICELIST_VERSION_ID = Number(process.env.PURCHASE_PRICE_LIST_VERSION_ID) || 1000004
  const plvRes: any = await fetchHelper(
    event,
    `models/m_pricelist_version/${PRICELIST_VERSION_ID}`,
    'GET',
    token,
    null
  )
  const plId = plvRes?.M_PriceList_ID?.id
  if (plId) {
    let currencyId = 102
    let currency = 'EUR'
    const plRes: any = await fetchHelper(
      event,
      `models/m_pricelist/${plId}`,
      'GET',
      token,
      null
    )
    if (plRes?.C_Currency_ID?.id) {
      currencyId = plRes.C_Currency_ID.id
      currency = plRes.C_Currency_ID.identifier || currency
    }
    data.priceList = {
      id: plId,
      identifier: plvRes?.M_PriceList_ID?.identifier || plRes?.Name || '',
      versionId: PRICELIST_VERSION_ID,
      versionIdentifier: plvRes?.Name || '',
      currencyId,
      currency
    }
  } else {
    data.priceList = {
      id: '',
      identifier: '',
      versionId: PRICELIST_VERSION_ID,
      versionIdentifier: '',
      currencyId: 102,
      currency: 'EUR'
    }
  }

  return data
}

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