import { date } from 'alga-js'
import fetchHelper from './fetchHelper'
import sqliteHelper from './sqliteHelper'
import setAuthCookie from './setAuthCookie'
import refreshTokensRaw from './tokenRefreshCore'
import { trimUser, trimRole, trimOrganization, trimClient, trimWarehouse } from './trimCookieData'

export default async function refreshTokenHelper(event: any) {
  let token = getCookie(event, 'logship_it')
  const clientId = getCookie(event, 'logship_client_id')
  const roleId = getCookie(event, 'logship_role_id')
  const organizationId = getCookie(event, 'logship_organization_id')
  const warehouseId = getCookie(event, 'logship_warehouse_id')

  // Guarded two-tier refresh (auth/refresh → credential login). Throws without
  // calling iDempiere when the stored cookies cannot possibly authenticate —
  // see tokenRefreshCore.ts / authCooldown.ts.
  const resToken: any = await refreshTokensRaw(event)

  if(resToken.userId) {
    setAuthCookie(event, 'logship_user_id', resToken.userId)

    const resUser: any = await fetchHelper(event, 'models/ad_user/'+resToken.userId, 'GET', resToken.token, null)
    if(resUser) {
      setAuthCookie(event, 'logship_user', trimUser(resUser))
    }
    if(clientId) {
      const resClient: any = await fetchHelper(event, 'models/ad_client/'+clientId, 'GET', resToken.token, null)
      if(resClient) {
        setAuthCookie(event, 'logship_client', trimClient(resClient))
      }
    }
    if(roleId) {
      const resRole: any = await fetchHelper(event, 'models/ad_role/'+roleId, 'GET', resToken.token, null)
      if(resRole) {
        setAuthCookie(event, 'logship_role', trimRole(resRole))
      }
    }
    if(organizationId) {
      const resOrg: any = await fetchHelper(event, 'models/ad_org/'+organizationId, 'GET', resToken.token, null)
      if(resOrg) {
        setAuthCookie(event, 'logship_organization', trimOrganization(resOrg))
      }
    }
    if(warehouseId) {
      const resWarehouse: any = await fetchHelper(event, 'models/m_warehouse/'+warehouseId, 'GET', resToken.token, null)
      if(resWarehouse) {
        setAuthCookie(event, 'logship_warehouse', trimWarehouse(resWarehouse))
      }
    }

  }
  if(resToken.token) {
    token = resToken.token
    setAuthCookie(event, 'logship_it', resToken.token)
    setAuthCookie(event, 'logship_rt', resToken.refresh_token)

    sqliteHelper(event, (db) => {
      const stmt = db.prepare("INSERT INTO refresh_tokens (refresh_token, token, expiration) VALUES (?, ?, ?)")
      stmt.run(resToken.refresh_token, resToken.token, date.add(date.now(''), 1))
      stmt.finalize()
    })

    return resToken.token
  }

  return token
}
