import { InjectQueue } from "@nestjs/bullmq";
import { Injectable } from "@nestjs/common";
import EventBus from "@server/utils/event-bus";
import { Queue } from "bullmq";
import { ObjectType } from "@nice/common";
import { QueueJobType } from "../types";
@Injectable()
export class StatsService {
    constructor(
        @InjectQueue('general') private generalQueue: Queue
    ) {
        EventBus.on("dataChanged", async ({ type, data }) => {
            const jobOptions = {
                removeOnComplete: true,
                jobId: this.generateJobId(type as ObjectType, data) // 使用唯一ID防止重复任务
            };
            switch (type) {
                case ObjectType.ENROLLMENT:
                    await this.generalQueue.add(
                        QueueJobType.UPDATE_STATS,
                        {
                            courseId: data.courseId,
                            type: ObjectType.ENROLLMENT
                        },
                        jobOptions
                    );
                    break;

                case ObjectType.LECTURE:
                    await this.generalQueue.add(
                        QueueJobType.UPDATE_STATS,
                        {
                            sectionId: data.sectionId,
                            courseId: data.courseId,
                            type: ObjectType.LECTURE
                        },
                        jobOptions
                    );
                    break;

                case ObjectType.POST:
                    if (data.courseId) {
                        await this.generalQueue.add(
                            QueueJobType.UPDATE_STATS,
                            {
                                courseId: data.courseId,
                                type: ObjectType.POST
                            },
                            jobOptions
                        );
                    }
                    break;
            }
        });
    }

    private generateJobId(type: ObjectType, data: any): string {
        // 根据类型和相关ID生成唯一的job标识
        switch (type) {
            case ObjectType.ENROLLMENT:
                return `stats_${type}_${data.courseId}`;
            case ObjectType.LECTURE:
                return `stats_${type}_${data.courseId}_${data.sectionId}`;
            case ObjectType.POST:
                return `stats_${type}_${data.courseId}`;
            default:
                return `stats_${type}_${Date.now()}`;
        }
    }
}