"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const messageRecordModel_1 = require("../models/messageRecordModel");
const userModel_1 = require("../models/userModel");
const database_1 = require("../database");
/**
 * 这是一个用于回填 MessageRecord 表中 cc 字段的脚本。
 * 它会从 User 表中查找每个 uid 对应的 cc 值，并更新 MessageRecord。
 */
const backfillCc = async () => {
    console.log("[Backfill Script] 开始连接数据库...");
    await (0, database_1.connectToDatabase)();
    try {
        // 仅查询那些缺少 cc 字段的 MessageRecord 文档，以提高效率。
        // 这也确保了脚本的幂等性，可以安全地多次运行。
        const recordsToUpdate = messageRecordModel_1.MessageRecord.find({ cc: { $exists: false } }).cursor();
        console.log("[Backfill Script] 找到需要回填的记录。开始处理...");
        let count = 0;
        // 使用游标（cursor）逐个处理文档，避免一次性加载大量数据到内存中。
        for await (const record of recordsToUpdate) {
            count++;
            console.log(`[Backfill Script] 正在处理第 ${count} 条记录, _id: ${record._id}`);
            // 从用户表中查找对应的 cc 字段，仅投影需要的字段以优化查询性能。
            const user = await userModel_1.User.findOne({ uid: record.uid }, { cc: 1 }).lean();
            if (user && user.cc) {
                // 如果找到用户和 cc 字段，则更新 MessageRecord。
                await messageRecordModel_1.MessageRecord.updateOne({ _id: record._id }, { $set: { cc: user.cc } });
                console.log(`[Backfill Script] 成功为记录 ${record._id} 回填了 cc 字段: ${user.cc}`);
            }
            else {
                // 如果用户或 cc 字段未找到，打印警告信息。
                console.warn(`[Backfill Script] 未找到用户 ${record.uid} 或其 cc 字段，跳过此记录。`);
            }
        }
        console.log(`[Backfill Script] 脚本执行完毕。总共处理了 ${count} 条记录。`);
    }
    catch (error) {
        console.error("[Backfill Script] 脚本执行过程中发生错误:", error);
    }
    finally {
        console.log("[Backfill Script] 断开数据库连接...");
        await (0, database_1.disconnectFromDatabase)();
        process.exit(0);
    }
};
// 确保脚本被直接运行时才执行 backfillCc 函数。
if (require.main === module) {
    backfillCc().catch((err) => {
        console.error("脚本启动失败:", err);
        process.exit(1);
    });
}
