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

/**
 * Session refresh endpoint for PWA resume.
 * Validates the current token against iDempiere and refreshes if expired.
 * Returns { valid: true } if session is active, or refreshes and returns the new state.
 */
const handleFunc = async (event: any, authToken: string | null = null) => {
  const token = authToken ?? await getTokenHelper(event)
  // Make a lightweight call to iDempiere to validate the token.
  // NB: query columns must be real DB columns — '$select=id' is rejected
  // ("id is not a valid column of table AD_User").
  const res = await fetchHelper(event, 'models/ad_user?$top=1&$select=AD_User_ID', 'GET', token, null)
  return { valid: true }
}

export default defineEventHandler(async (event) => {
  let data: any = {}
  try {
    data = await handleFunc(event)
  } catch (err: any) {
    const status = err?.statusCode ?? err?.status ?? err?.data?.status
    if (status === 401 || status === 403) {
      try {
        // Token expired — refresh it (this sets new cookies via setAuthCookie)
        let authToken = await refreshTokenHelper(event)
        data = { valid: true, refreshed: true }
      } catch (error: any) {
        data = { valid: false }
      }
    } else {
      // Transient/non-auth error — don't burn a refresh (and don't log the
      // user out); the session can't be disproven invalid.
      data = { valid: true }
    }
  }
  return data
})