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

// Normalize an iDempiere date value to a plain YYYY-MM-DD string. Date columns
// come back as "2026-06-04" (date-only) but tolerate a "…T00:00:00Z" timestamp
// shape too, so we always slice the first 10 chars.
const toDateStr = (val: any): string => {
  if(!val) return ''
  return String(val).slice(0, 10)
}

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

  // Non-working days are warehouse-wide closures (the seed data lives on the
  // shared org "*"/0). The bearer token already scopes the query to the
  // customer's tenant (AD_Client_ID), so we return every ACTIVE entry and let
  // the client decide which fall inside the month being viewed.
  const res: any = await fetchHelper(event, `models/cust_nonworkingdays?$filter=${string.urlEncode('isActive eq true')}&$orderby=${string.urlEncode('DateFrom asc')}`, 'GET', token, null)

  const records = (res?.records || []).map((item: any) => ({
    id: item.id,
    name: item.Name ?? item.name ?? '',
    description: item.Description ?? item.description ?? '',
    dateFrom: toDateStr(item.DateFrom ?? item.dateFrom),
    dateTo: toDateStr(item.DateTo ?? item.dateTo)
  })).filter((r: any) => r.dateFrom)

  return { records }
}

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

  try {
    data = await handleFunc(event)
  } catch(err: any) {
    try {
      let authToken: any = await refreshTokenHelper(event)
      data = await handleFunc(event, authToken)
    } catch(error: any) {
      data = { records: [], error: errorHandlingHelper(err?.data ?? err, error?.data ?? error) }
    }
  }

  return data
})
