/**
 * `lead.score_recalc` queue consumer — lead-qualification-scoring (wave-14).
 *
 * Processes async lead score recalculation messages dispatched by:
 *  - stage-change handlers
 *  - activity-create handlers
 *  - estimated_value / company / phone update handlers
 *  - proposal-status → VIEWED handlers
 *  - nightly lead-score-refresh cron
 *
 * Message type: 'lead.score_recalc'
 * Payload: { leadId: string; tenantId: string }
 */
import type { MessageBatch, Message } from '@cloudflare/workers-types'
import type { Env } from '@zync/types'
import { createDb, computeAndSaveLeadScore } from '@zync/db/queries'

export interface LeadScoreRecalcJob {
  type: 'lead.score_recalc'
  leadId: string
  tenantId: string
}

export async function handleLeadScoreRecalcBatch(
  batch: MessageBatch<LeadScoreRecalcJob>,
  env: Env,
): Promise<void> {
  const db = createDb(env)

  for (const msg of batch.messages as Message<LeadScoreRecalcJob>[]) {
    const job = msg.body
    if (!job || job.type !== 'lead.score_recalc') {
      msg.ack()
      continue
    }
    try {
      await computeAndSaveLeadScore(db, job.tenantId, job.leadId)
      msg.ack()
    } catch (err) {
      console.error(`[lead-score-recalc] failed leadId=${job.leadId}:`, err)
      // Let the queue retry; do not ack on failure
      msg.retry()
    }
  }
}

/**
 * Enqueue a single lead for async score recalculation.
 * Safe to call from any route handler — non-blocking.
 */
export function enqueueLeadScoreRecalc(
  env: Env,
  tenantId: string,
  leadId: string,
): void {
  const job: LeadScoreRecalcJob = { type: 'lead.score_recalc', tenantId, leadId }
  // Fire-and-forget — queue send is async but we don't need to await it in hot paths
  void env.QUEUE.send(job).catch((err) => {
    console.error('[lead-score-recalc] enqueue failed:', err)
  })
}
