import { Injectable, Logger, OnModuleInit } from '@nestjs/common';
import { PrismaService } from '@chatapp/database';
import { RedisService } from '@chatapp/redis';

@Injectable()
export class ScheduledMessagesProcessor implements OnModuleInit {
  private readonly logger = new Logger(ScheduledMessagesProcessor.name);
  private running = false;

  constructor(
    private readonly prisma: PrismaService,
    private readonly redis: RedisService,
  ) {}

  async onModuleInit() {
    this.running = true;
    this.processLoop();
    this.logger.log('Scheduled messages processor started');
  }

  private async processLoop() {
    while (this.running) {
      try {
        // Check for scheduled messages that are due
        const dueMessages = await this.prisma.message.findMany({
          where: {
            isScheduled: true,
            scheduledFor: { lte: new Date() },
            isDeleted: false,
          },
          take: 10,
        });

        for (const msg of dueMessages) {
          await this.sendScheduledMessage(msg);
        }

        // Wait 30 seconds before next check
        await new Promise((r) => setTimeout(r, 30000));
      } catch (err) {
        this.logger.error(`Scheduled messages error: ${err}`);
        await new Promise((r) => setTimeout(r, 10000));
      }
    }
  }

  private async sendScheduledMessage(msg: any) {
    try {
      // Mark as sent (remove scheduled flag)
      await this.prisma.message.update({
        where: { id: msg.id },
        data: {
          isScheduled: false,
          scheduledFor: null,
          updatedAt: new Date(),
        },
      });

      // Publish via Redis pub/sub for real-time delivery
      await this.redis.client?.publish(
        `channel:${msg.channelId}`,
        JSON.stringify({
          event: 'message:new',
          data: msg,
        }),
      );

      this.logger.log(`Scheduled message ${msg.id} sent`);
    } catch (err) {
      this.logger.error(`Failed to send scheduled message ${msg.id}: ${err}`);
    }
  }
}