// oms/src/controllers/messageTemplateController.ts

import { Request, Response } from "express";
import { messageTemplateService } from "../services/messageTemplateService";
import { IMessageTemplate, TemplateType } from "../models/messageTemplateModel";
import mongoose from "mongoose";

class MessageTemplateController {
  /**
   * 创建新的消息模板。
   * POST /api/message-templates
   */
  public async createTemplate(req: Request, res: Response): Promise<void> {
    try {
      const { templateName, messageTitle, messageContent, templateType } = req.body;

      // 验证必需字段
      if (!templateName || !messageTitle || !messageContent || typeof templateType === "undefined") {
        res.status(400).json({ message: "templateName, messageTitle, messageContent 和 templateType 都是必需的。" });
        return;
      }

      // 验证 templateType 是否为有效的枚举值
      if (typeof templateType !== "number" || !(templateType in TemplateType)) {
        res.status(400).json({ message: "templateType 必须是有效的数字枚举值。" });
        return;
      }

      const newTemplate = await messageTemplateService.createTemplate(req.body);
      res.status(201).json(newTemplate);
    } catch (error: any) {
      if (error.code === 11000) {
        res.status(409).json({ message: "模板名称已存在。", error: error.message });
      } else if (error instanceof mongoose.Error.ValidationError) {
        res.status(400).json({ message: "验证错误。", error: error.message });
      } else {
        res.status(500).json({ message: "创建模板时出错。", error: error.message });
      }
    }
  }

  /**
   * 根据名称获取消息模板。
   * GET /api/message-templates/:templateName
   */
  public async getTemplateByName(req: Request, res: Response): Promise<void> {
    try {
      const { templateName } = req.params;
      const template = await messageTemplateService.getTemplateByName(templateName);

      if (template) {
        res.status(200).json(template);
      } else {
        res.status(404).json({ message: "未找到指定的模板。" });
      }
    } catch (error: any) {
      res.status(500).json({ message: "获取模板时出错。", error: error.message });
    }
  }

  /**
   * 获取所有消息模板，并支持按模板类型筛选。
   * GET /api/message-templates
   */
  public async getAllTemplates(req: Request, res: Response): Promise<void> {
    try {
      const { templateType } = req.query;
      let templates: IMessageTemplate[];

      if (templateType) {
        // 如果提供了 templateType，则按类型筛选
        const type = parseInt(templateType as string, 10);
        if (isNaN(type) || !(type in TemplateType)) {
          res.status(400).json({ message: "无效的 templateType 参数。" });
          return;
        }
        templates = await messageTemplateService.getTemplatesByType(type as TemplateType);
      } else {
        // 否则获取所有模板
        templates = await messageTemplateService.getAllTemplates();
      }

      res.status(200).json(templates);
    } catch (error: any) {
      res.status(500).json({ message: "获取所有模板时出错。", error: error.message });
    }
  }

  /**
   * 更新一个消息模板。
   * PUT /api/message-templates/:templateName
   */
  public async updateTemplate(req: Request, res: Response): Promise<void> {
    try {
      const { templateName } = req.params;
      const updateData = req.body;

      if (updateData.templateType !== undefined && (typeof updateData.templateType !== "number" || !(updateData.templateType in TemplateType))) {
        res.status(400).json({ message: "templateType 必须是有效的数字枚举值。" });
        return;
      }

      const updatedTemplate = await messageTemplateService.updateTemplate(templateName, updateData);

      if (updatedTemplate) {
        res.status(200).json(updatedTemplate);
      } else {
        res.status(404).json({ message: "未找到指定的模板。" });
      }
    } catch (error: any) {
      res.status(500).json({ message: "更新模板时出错。", error: error.message });
    }
  }

  /**
   * 删除一个消息模板。
   * DELETE /api/message-templates/:templateName
   */
  public async deleteTemplate(req: Request, res: Response): Promise<void> {
    try {
      const { templateName } = req.params;
      const result = await messageTemplateService.deleteTemplate(templateName);

      if (result.deletedCount && result.deletedCount > 0) {
        res.status(204).send();
      } else {
        res.status(404).json({ message: "未找到指定的模板。" });
      }
    } catch (error: any) {
      res.status(500).json({ message: "删除模板时出错。", error: error.message });
    }
  }
}

const messageTemplateController = new MessageTemplateController();
export default messageTemplateController;
