import { Inject, Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { Model } from 'mongoose';
import {
  AutomationJob,
  AutomationJobDocument,
} from '../schemas/automation-job.schema';
import type { AutomationJobData } from './automation-job-data';
import { QUEUE_PORT, type QueuePort } from './queue-port';

@Injectable()
export class AutomationQueueService {
  constructor(
    @Inject(QUEUE_PORT)
    private readonly queue: QueuePort,
    @InjectModel(AutomationJob.name)
    private readonly jobModel: Model<AutomationJobDocument>,
  ) {}

  async enqueue(data: AutomationJobData, delayMs = 0) {
    const runAt = new Date(Date.now() + Math.max(delayMs, 0));
    const queued = await this.queue.enqueue(data, delayMs);

    await this.jobModel.create({
      runId: data.runId,
      automationId: data.automationId,
      nodeKey: data.nodeKey,
      status: queued.degraded
        ? 'DEGRADED'
        : delayMs > 0
          ? 'DELAYED'
          : 'PENDING',
      runAt,
      attempts: data.attempt,
      metadata: {
        queueJobId: queued.id,
        degraded: queued.degraded,
        delayMs,
      },
    });

    return queued;
  }

  isAvailable() {
    return this.queue.isAvailable();
  }
}
