import refreshTokenHelper from '../../utils/refreshTokenHelper'
import fetchHelper from '../../utils/fetchHelper'

const SECOND_SWEEP_DELAY_MS = 3000

const fetchSessionUuids = async (event: any, token: string, sessionUID: string): Promise<string[]> => {
  const filter = encodeURIComponent(`SessionUID eq '${sessionUID.replace(/'/g, "''")}'`)
  const list: any = await fetchHelper(
    event,
    `models/cust_commissionactivity?$filter=${filter}&$top=500`,
    'GET',
    token,
    null,
  )
  const records = Array.isArray(list?.records) ? list.records : []
  const uuids = records
    .map((r: any) => String(r?.uid ?? r?.['CUST_CommissionActivity_UU'] ?? '').trim())
    .filter((u: string) => u.length > 0)
  console.log('[commission-activity] sweep found', uuids.length, 'rows for SessionUID', sessionUID, 'sample keys:', Object.keys(records?.[0] ?? {}).slice(0, 12))
  return uuids
}

const deleteUuids = async (event: any, token: string, uuids: string[]) => {
  if (!uuids.length) return
  const results = await Promise.allSettled(
    uuids.map((uuid) =>
      fetchHelper(event, `models/cust_commissionactivity/${uuid}`, 'DELETE', token, null),
    ),
  )
  const firstFail = results.find((r) => r.status === 'rejected') as PromiseRejectedResult | undefined
  const firstOk = results.find((r) => r.status === 'fulfilled') as PromiseFulfilledResult<any> | undefined
  console.log('[commission-activity] DELETE batch size', uuids.length,
    'ok:', results.filter(r => r.status === 'fulfilled').length,
    'failed:', results.filter(r => r.status === 'rejected').length,
    'first response:', firstOk ? JSON.stringify(firstOk.value).slice(0, 300) : '(none)')
  if (firstFail) {
    const reason: any = firstFail.reason
    console.error('[commission-activity] DELETE rejected:', {
      statusCode: reason?.statusCode ?? reason?.response?.status,
      message: reason?.message,
      data: reason?.data,
    })
  }
}

const sweep = async (event: any, token: string, sessionUID: string) => {
  const uuids = await fetchSessionUuids(event, token, sessionUID)
  await deleteUuids(event, token, uuids)
}

const discardSession = async (event: any, sessionUID: string) => {
  let token: string | null = null
  try {
    token = await getTokenHelper(event)
  } catch {
    return
  }
  if (!token) return

  try {
    await sweep(event, token, sessionUID)
  } catch (e: any) {
    console.error('[commission-activity] delete sweep failed:', {
      sessionUID,
      statusCode: e?.statusCode ?? e?.response?.status,
      message: e?.message,
      data: e?.data,
    })
    try {
      const fresh: any = await refreshTokenHelper(event)
      if (!fresh) return
      token = fresh
      await sweep(event, token as string, sessionUID)
    } catch (retryErr: any) {
      console.error('[commission-activity] delete sweep failed after token refresh:', {
        sessionUID,
        message: retryErr?.message,
      })
      return
    }
  }

  const finalToken = token
  setTimeout(() => {
    if (!finalToken) return
    sweep(event, finalToken as string, sessionUID).catch(() => {})
  }, SECOND_SWEEP_DELAY_MS)
}

export default defineEventHandler(async (event) => {
  let body: any = null
  try {
    body = await readBody(event)
  } catch {
    body = null
  }

  const sessionUID = String(body?.sessionUID ?? '').trim()
  if (sessionUID) {
    discardSession(event, sessionUID).catch(() => {})
  }

  setResponseStatus(event, 204)
  return null
})
