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

/**
 * Retrieve a stored DPD label.
 *
 * DPD has no "re-print label" endpoint, so we return the cached base64
 * label PDF from M_Inout. The response shape mirrors what the DHL retrieve
 * endpoint returns so the frontend can consume it identically.
 *
 * Query params:
 *   - shipment_code: DPD mpsId or tracking number stored in M_Inout
 *   - inout_id: alternative lookup key
 */
const handleFunc = async (event: any, authToken: any = null) => {
  const token = authToken ?? await getTokenHelper(event)
  const query = getQuery(event)

  let inout: any = null

  if (query?.inout_id) {
    inout = await fetchHelper(event, `models/m_inout/${query.inout_id}`, 'GET', token, null)
  } else if (query?.shipment_code) {
    // Look up by DPD_Shipment_Code OR TrackingNo (covers both mpsId and label number lookups)
    const code = String(query.shipment_code)
    const filter = `DPD_Shipment_Code eq '${code}' or TrackingNo eq '${code}'`
    const res: any = await fetchHelper(event, `models/m_inout?$filter=${string.urlEncode(filter)}&$top=1`, 'GET', token, null)
    inout = res?.records?.[0] ?? null
  }

  if (!inout) {
    return { items: [], status: 404, message: 'DPD shipment not found' }
  }

  // Mirror DHL retrieve shape: { items: [{ shipmentNo, label: { b64 }, routingCode }] }
  return {
    items: [{
      shipmentNo: inout.DPD_Shipment_Code || inout.TrackingNo || '',
      parcelLabelNumber: inout.TrackingNo || '',
      routingCode: '',
      label: { b64: inout.DPD_Label_Base64 || '' }
    }],
    status: 200
  }
}

export default defineEventHandler(async (event) => {
  let data: any = null
  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)
    }
  }
  return data
})
