import { and, eq } from '@baguspay/db'
import { DepositStatus, tb } from '@baguspay/db/types'
import { Processor, WorkerHost } from '@nestjs/bullmq'
import { Logger } from '@nestjs/common'
import type { Job } from 'bullmq'
import { DatabaseService } from 'src/core/database/database.service'

@Processor('deposits-queue')
export class DepositQueueConsumer extends WorkerHost {
  private logger = new Logger(DepositQueueConsumer.name)

  constructor(private readonly databaseService: DatabaseService) {
    super()
  }

  async process(job: Job<any, any, string>) {
    switch (job.name) {
      case 'expired-deposit': {
        const { depositId } = job.data as { depositId: string }

        // Fetch the deposit from the database
        const deposit = await this.databaseService.db.query.deposits.findFirst({
          where: and(
            eq(tb.deposits.deposit_id, depositId),
            eq(tb.deposits.status, DepositStatus.PENDING),
          ),
        })

        if (!deposit) {
          this.logger.warn(`Deposit with ID ${depositId} not found or already processed.`)
          return 'Deposit not found or already processed'
        }

        await this.databaseService.db
          .update(tb.deposits)
          .set({ status: DepositStatus.EXPIRED })
          .where(eq(tb.deposits.deposit_id, depositId))

        this.logger.log(`Deposit with ID ${depositId} has been marked as expired.`)

        return `Deposit with ID ${depositId} marked as expired`
      }
    }
  }
}
