// All M_Transaction rows of one organization (= its warehouse) in a date window, enriched like the
// product-history route. Query: orgId (required), from / to (YYYY-MM-DD, default last 30 days),
// top (hard cap MAX_ROWS). Response: { records, rowCount, truncated, from, to }.
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"
import { enrichTransactions } from "../../utils/transactionEnrichHelper"

const MAX_ROWS = 5000
const PAGE = 1000

const isoDate = (d: Date) => d.toISOString().slice(0, 10)
const validDate = (v: any) => typeof v === 'string' && /^\d{4}-\d{2}-\d{2}$/.test(v) ? v : null

const handleFunc = async (event: any, authToken: any = null) => {
  const token = authToken ?? await getTokenHelper(event)
  const query = getQuery(event)
  const orgId = Number(query.orgId)

  if (!orgId || orgId <= 0) {
    setResponseStatus(event, 400)
    return { status: 400, message: 'Organization ID is required', records: [] }
  }

  const today = new Date()
  const to = validDate(query.to) ?? isoDate(today)
  const from = validDate(query.from) ?? isoDate(new Date(today.getTime() - 30 * 86400000))
  const top = Math.min(Math.max(Number(query.top) || MAX_ROWS, 1), MAX_ROWS)

  const filter = `AD_Org_ID eq ${orgId} and MovementDate ge '${from}' and MovementDate le '${to}'`

  // Page through newest-first until the cap; idempiere-rest reports the full count as row-count.
  const records: any[] = []
  let rowCount = 0
  for (let skip = 0; skip < top; skip += PAGE) {
    const pageTop = Math.min(PAGE, top - skip)
    const res: any = await fetchHelper(
      event,
      `models/m_transaction?$filter=${string.urlEncode(filter)}&$orderby=${string.urlEncode('MovementDate desc, M_Transaction_ID desc')}&$top=${pageTop}&$skip=${skip}`,
      'GET',
      token,
      null
    )
    const page = res?.records || []
    if (skip === 0) rowCount = Number(res?.['row-count']) || page.length
    records.push(...page)
    if (page.length < pageTop || records.length >= rowCount) break
  }

  const enriched = await enrichTransactions(event, token, records)

  return {
    records: enriched,
    rowCount,
    truncated: rowCount > enriched.length,
    from,
    to
  }
}

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)
      forceLogoutHelper(event, data)
    }
  }

  return data
})
