import * as dotenv from "dotenv";
dotenv.config();

import mongoose from "mongoose";
import { Request, Response } from "express";
import userController from "../controllers/userController"; // 确保路径正确

// --- 环境配置 ---
const OMS_MONGO_URI = process.env.MONGO_URI || "mongodb://oms:oms123.@localhost:27717/omsdb?authSource=admin";
// 定义一个目标用户UID的数组，您可以随时添加或移除用户。
const TARGET_UIDS = ["my-samsumg", "chenxinmiao", "chenxinmiao2"];
const SEND_INTERVAL_MS = 10 * 60 * 1000; // 10 分钟

// --- 消息内容 ---
const MESSAGE_CONTENT = {
  content: "🎉 Every tap births a new universe. 🎉",
  image: "https://color.jccytech.cn/thumbs/v2/page/640/68b7f2bfe5ced54b83ecf8d3.png",
  bigger: true,
};

// 消息序号，从 0 开始
let messageCounter = 181;
let intervalId: NodeJS.Timeout | null = null;

/**
 * 模拟一个简化的 Express Response 对象，用于传递给控制器方法。
 * 它会捕获状态码和 JSON 响应，并打印到控制台。
 */
class MockResponse {
  private statusCode: number = 200;

  status(code: number): this {
    this.statusCode = code;
    return this;
  }

  json(data: any): this {
    console.log(`[响应] 状态码: ${this.statusCode}`);
    console.log("[响应] JSON 数据:", JSON.stringify(data, null, 2));
    return this;
  }
}

/**
 * 异步函数，直接调用 userController.sendDirectMessage 方法。
 * 每次调用都会递增消息序号，并为每个目标用户构建相应的请求体。
 */
async function sendFCMMessage() {
  messageCounter++;
  const dynamicTitle = `${messageCounter}. ❤️ Time to Relax!`;

  for (const uid of TARGET_UIDS) {
    // 模拟一个 Express Request 对象
    const mockRequest = {
      body: {
        uid: uid,
        title: dynamicTitle,
        ...MESSAGE_CONTENT,
      },
    } as Request; // 类型断言为 Request

    const mockResponse = new MockResponse() as unknown as Response; // 类型断言为 Response

    console.log(`\n[${new Date().toLocaleString()}] 正在调用后端方法发送第 ${messageCounter} 条消息给用户：${uid}...`);

    try {
      await userController.sendDirectMessage(mockRequest, mockResponse);
    } catch (error: any) {
      console.error(`[${new Date().toLocaleString()}] 调用 sendDirectMessage 方法失败，用户：${uid}，错误：`, error);
    }
  }
}

/**
 * 初始化并启动脚本。
 * 连接到 MongoDB，然后设置定时器。
 */
async function startScript() {
  try {
    await mongoose.connect(OMS_MONGO_URI);
    console.log(`[MongoDB] 已连接到数据库: ${OMS_MONGO_URI}`);

    // 立即运行一次
    await sendFCMMessage();

    // 设置定时器，每 10 分钟运行一次
    intervalId = setInterval(sendFCMMessage, SEND_INTERVAL_MS);

    console.log(`\n脚本已启动。将每隔 10 分钟向 ${TARGET_UIDS.length} 位用户发送一次 FCM 消息。`);
    console.log(`按下 Ctrl + C 停止脚本。`);
  } catch (error) {
    console.error("[初始化失败] 无法连接到 MongoDB 或启动脚本:", error);
    process.exit(1);
  }
}

// --- 优雅退出处理 ---
async function gracefulShutdown() {
  console.log("\n[退出] 脚本正在关闭...");
  if (intervalId) {
    clearInterval(intervalId);
  }
  if (mongoose.connection.readyState === 1) {
    await mongoose.disconnect();
    console.log("[MongoDB] 数据库连接已关闭。");
  }
  process.exit(0);
}

process.on("SIGINT", gracefulShutdown);
process.on("SIGTERM", gracefulShutdown);

// 启动脚本
startScript();
