// oms/src/src/services/messageStrategyService.ts

import { MessageStrategy, IMessageStrategy } from "../models/messageStrategyModel";
import { IMessageTemplate, MessageTemplate } from "../models/messageTemplateModel";

/**
 * 获取所有消息策略列表，按创建时间降序排列。
 * @returns 包含消息策略对象的 Promise，其中 templates 字段已填充。
 */
export const getStrategies = async (): Promise<IMessageStrategy[]> => {
  try {
    const strategies = await MessageStrategy.find({})
      .sort({ createdAt: -1 }) // 按创建时间降序排列
      .populate({
        path: "templates",
        select: "templateName description",
        model: MessageTemplate,
      })
      .exec();
    return strategies as IMessageStrategy[];
  } catch (error) {
    console.error("获取消息策略列表失败：", error);
    throw new Error("无法获取消息策略列表。");
  }
};

/**
 * 根据 ID 获取单个消息策略的详情。
 * @param id 消息策略的 ObjectId
 * @returns 包含单个消息策略对象的 Promise，如果未找到则返回 null。
 */
export const getStrategyById = async (id: string): Promise<IMessageStrategy | null> => {
  try {
    const strategy = await MessageStrategy.findById(id)
      .populate({
        path: "templates",
        select: "templateName description",
        model: MessageTemplate,
      })
      .exec();
    return strategy as IMessageStrategy | null;
  } catch (error) {
    console.error(`获取 ID 为 ${id} 的消息策略失败：`, error);
    throw new Error(`无法获取 ID 为 ${id} 的消息策略。`);
  }
};

/**
 * 根据 name 获取单个消息策略的详情。
 * @param id 消息策略的 ObjectId
 * @returns 包含单个消息策略对象的 Promise，如果未找到则返回 null。
 */
export const getStrategyByName = async (name: string): Promise<IMessageStrategy | null> => {
  try {
    const strategy = await MessageStrategy.findOne({ name })
      .populate({
        path: "templates",
        select: "templateName description",
        model: MessageTemplate,
      })
      .exec();
    return strategy as IMessageStrategy | null;
  } catch (error) {
    console.error(`获取 name 为 ${name} 的消息策略失败：`, error);
    throw new Error(`无法获取 ID 为 ${name} 的消息策略。`);
  }
};

/**
 * 创建一个新的消息策略。
 * @param strategyData 要创建的策略数据。
 * @returns 创建成功的消息策略对象。
 */
export const createStrategy = async (strategyData: Partial<IMessageStrategy>): Promise<IMessageStrategy> => {
  try {
    const newStrategy = new MessageStrategy(strategyData);
    const savedStrategy = await newStrategy.save();
    return savedStrategy;
  } catch (error) {
    console.error("创建消息策略失败：", error);
    throw new Error("无法创建消息策略。");
  }
};

/**
 * 根据 ID 更新消息策略。
 * @param id 消息策略的 ObjectId。
 * @param updateData 要更新的字段数据。
 * @returns 更新后的消息策略对象。
 */
export const updateStrategy = async (id: string, updateData: Partial<IMessageStrategy>): Promise<IMessageStrategy | null> => {
  try {
    const updatedStrategy = await MessageStrategy.findByIdAndUpdate(id, updateData, { new: true });
    return updatedStrategy;
  } catch (error) {
    console.error(`更新 ID 为 ${id} 的消息策略失败：`, error);
    throw new Error(`无法更新 ID 为 ${id} 的消息策略。`);
  }
};

/**
 * 根据 ID 删除消息策略。
 * @param id 消息策略的 ObjectId。
 * @returns 删除成功的消息策略对象。
 */
export const deleteStrategy = async (id: string): Promise<IMessageStrategy | null> => {
  try {
    const deletedStrategy = await MessageStrategy.findByIdAndDelete(id);
    return deletedStrategy;
  } catch (error) {
    console.error(`删除 ID 为 ${id} 的消息策略失败：`, error);
    throw new Error(`无法删除 ID 为 ${id} 的消息策略。`);
  }
};
