import { string } from 'alga-js'
import refreshTokenHelper from "../../../../utils/refreshTokenHelper"
import forceLogoutHelper from "../../../../utils/forceLogoutHelper"
import errorHandlingHelper from "../../../../utils/errorHandlingHelper"
import { isSigningAvailable, getLatestSigningRequestForRecord, effectiveStatus } from "../../../../utils/offers/contractSigningDb"

// Latest online quote-confirmation / contract-signing link of a lead, reduced
// to the badge state the dashboard card shows: 'signed' (accepted / signed —
// coloured) or 'sent' (link out, not accepted yet: pending, expired, superseded,
// canceled — greyed). null = never sent online. Fail-soft: a signing-store
// problem must never break the leads feed.
const linkState = (leadId: number, kind: 'quote' | 'contract'): 'signed' | 'sent' | null => {
  try {
    if (!isSigningAvailable()) return null
    const r = getLatestSigningRequestForRecord('lead', leadId, kind)
    if (!r) return null
    return effectiveStatus(r) === 'signed' ? 'signed' : 'sent'
  } catch {
    return null
  }
}

// Compact feed for the dashboard "Neueste Leads" card — leads (sales or
// vendor) created in the last 14 days, newest first, capped to a handful.
const handleFunc = async (event: any, authToken: any = null) => {
  const token = authToken ?? await getTokenHelper(event)

  const since = new Date(Date.now() - 14 * 24 * 60 * 60 * 1000).toISOString().slice(0, 10)
  const filter = `(isSalesLead eq true OR isVendorLead eq true) AND Created ge '${since}'`

  const res: any = await event.context.fetch(
    `models/ad_user?$filter=${string.urlEncode(filter)}&$orderby=${string.urlEncode('Created desc')}&$top=8`,
    'GET', token, null
  )

  const records = (res?.records ?? []).map((item: any) => ({
    id: item.id,
    name: item.Name || '',
    companyname: item.companyname || '',
    created: item.Created || null,
    // Offer / contract online-link badges (see linkState above).
    quote: linkState(Number(item.id), 'quote'),
    contract: linkState(Number(item.id), 'contract')
  }))

  return { records }
}

export default defineEventHandler(async (event) => {
  let data: any = { records: [] }

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