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

type EventRow = {
  id?: number
  SessionUID?: string
  ActionType?: string
  ActionTime?: string
  Created?: string
  DurationMs?: number | string
  Qty?: number | string
  ShippingService?: string
  Description?: string
  AD_User_ID?: any
  Foreign_AD_Org_ID?: any
  M_InOut_ID?: any
  C_Order_ID?: any
  M_Product_ID?: any
  C_BPartner_ID?: any
}

const fkId = (v: any): number | null => {
  if (v == null) return null
  if (typeof v === 'number') return Number.isFinite(v) ? v : null
  if (typeof v === 'object' && v.id != null) return Number(v.id) || null
  const n = Number(v)
  return Number.isFinite(n) ? n : null
}
const fkName = (v: any, fallback = ''): string => {
  if (v && typeof v === 'object' && v.identifier) return String(v.identifier)
  return fallback
}
const n = (v: any): number => {
  const x = Number(v)
  return Number.isFinite(x) ? x : 0
}

const handleFunc = async (event: any, authToken: any = null) => {
  const token = authToken ?? await getTokenHelper(event)
  const q = getQuery(event)
  const sessionUID = String(q?.session_uid || '').trim()
  if (!sessionUID) return { sessionUID: '', events: [] }

  // Pull every event for this session — both active and previously-abandoned
  // (IsActive=false) rows are useful here for forensic inspection.
  const filter = `SessionUID eq '${sessionUID.replace(/'/g, "''")}'`
  const url = `models/cust_commissionactivity?$filter=${string.urlEncode(filter)}&$orderby=Created asc&$top=1000`
  const res: any = await fetchHelper(event, url, 'GET', token, null)
  const rows: EventRow[] = Array.isArray(res?.records) ? res.records : []

  // Build the step list: chronological events with delta from previous step.
  let prevMs = 0
  const events = rows.map((r, idx) => {
    const ms = n(r.DurationMs)
    const delta = idx === 0 ? 0 : Math.max(0, ms - prevMs)
    prevMs = ms
    return {
      stepIndex: idx + 1,
      actionType: r.ActionType || '',
      actionTime: r.ActionTime || r.Created || null,
      durationMs: ms,
      deltaMs: delta,
      qty: r.Qty != null ? Number(r.Qty) : null,
      shippingService: r.ShippingService || null,
      description: r.Description || null,
      adUserId: fkId(r.AD_User_ID),
      userName: fkName(r.AD_User_ID),
      mInoutId: fkId(r.M_InOut_ID),
      shipmentNo: fkName(r.M_InOut_ID),
      cOrderId: fkId(r.C_Order_ID),
      orderNo: fkName(r.C_Order_ID),
      cBPartnerId: fkId(r.C_BPartner_ID),
      partnerName: fkName(r.C_BPartner_ID),
      mProductId: fkId(r.M_Product_ID),
      productName: fkName(r.M_Product_ID),
      foreignAdOrgId: fkId(r.Foreign_AD_Org_ID),
      foreignOrgName: fkName(r.Foreign_AD_Org_ID),
    }
  })

  await enrichProductNames(event, token, events)

  return { sessionUID, events, totalSteps: events.length }
}

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