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

// Admin-only management endpoint. Standing extra order lines that
// server/api/fulfillment/generate-orders.post.ts appends to every order it
// generates for a fulfillment customer — see the admin check note there for
// why order generation itself does not go through this route.
const isAdmin = (event: any) => {
  try {
    return JSON.parse(getCookie(event, 'logship_role') ?? '{}')?.IsClientAdministrator === true
  } catch {
    return false
  }
}

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

  if(!isAdmin(event)) {
    return { status: 403, message: 'Admin access required', records: [], 'row-count': 0 }
  }

  // Without a partner we have nothing to scope to — return an empty list.
  if(!bpartnerId) {
    return { records: [], 'row-count': 0 }
  }

  const filter = string.urlEncode('C_BPartner_ID eq ' + bpartnerId + ' AND IsActive eq true')
  const orderby = string.urlEncode('cust_bpartner_extraorderline_id asc')
  const res: any = await fetchHelper(event, `models/cust_bpartner_extraorderline?$filter=${filter}&$orderby=${orderby}&$expand=M_Product_ID`, 'GET', token, null)
  if(res) {
    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)
      if([401, 402, 403, 407].includes(Number(data.status))) {
        //@ts-ignore
        setCookie(event, 'user', null)
      }
    }
  }

  return data
})
