package cn.axzo.msg.center.notices.manager.support;

import cn.axzo.msg.center.domain.entity.MNSChannelMessageTemplate;
import cn.axzo.msg.center.notices.common.enums.ReturnCodeEnum;
import cn.axzo.msg.center.notices.common.exception.BizException;
import cn.axzo.msg.center.notices.manager.api.MessageTemplateParamManager;
import cn.axzo.msg.center.notices.manager.api.dto.request.BatchMessageSendRequestDto;
import cn.axzo.msg.center.notices.manager.api.dto.request.MessageSendRequestDto;
import cn.axzo.msg.center.notices.manager.api.dto.request.SmsContentDto;
import cn.axzo.msg.center.notices.manager.api.dto.response.TemplateParamDto;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 创兰消息内部解析类
 *
 * @author zhaoyong
 * @see ChuangLanMessageContentSupport
 * @since 2021-08-19 10:14
 */
@Component("chuangLanMessageContentSupport")
public class ChuangLanMessageContentSupport {

  @Resource(name = "messageTemplateParamManager")
  private MessageTemplateParamManager messageTemplateParamManager;

  /**
   * 获取单条消息内容
   * @param requestDto
   * @param hasParam
   * @return
   */
  public String getSingleSmsContent(MessageSendRequestDto requestDto
      , MNSChannelMessageTemplate template, boolean hasParam){
    if(hasParam) {
      return getSingleVariableSmsContent(requestDto, template);
    } else {
      return getSingleCommonSmsContent(requestDto);
    }
  }

  /**
   * 获取批量消息内容
   * @param requestDto
   * @param hasParam
   * @return
   */
  public String getBatchSmsContent(BatchMessageSendRequestDto requestDto
      , MNSChannelMessageTemplate template, boolean hasParam){
    if(hasParam) {
      return getBatchVariableSmsContent(requestDto, template);
    } else {
      return getBatchCommonSmsContent(requestDto);
    }
  }

  /**
   * 获取相同内容变量接口消息内容
   * @param requestDto
   * @return
   */
  private String getSingleVariableSmsContent(MessageSendRequestDto requestDto, MNSChannelMessageTemplate template){
    // 查询消息模板中的变量名称列表
    List<TemplateParamDto> messageTemplateParams = messageTemplateParamManager.getByCode(template.getInnerTemplateNo());
    BizException.error(CollectionUtils.isNotEmpty(messageTemplateParams),
        ReturnCodeEnum.SYSTEM_ERROR, "变量模板顺序参数不能为空");

    // 把对象转换成变量名称字符串列表
    List<String> paramNames = messageTemplateParams.stream().map(v -> v.getParamName())
        .collect(Collectors.toList());

    // 定义单条消息中参数列表
    List<String> singleMessageParams = new ArrayList<>();
    // 第一个变量一定是手机号
    String phoneNo = requestDto.getPhoneNo();
    singleMessageParams.add(phoneNo);
    // 按照数据库定义的顺序查询模板变量的值
    for (String paramName : paramNames) {
      // 获取业务方传入的变量值
      Object paramValue = requestDto.getTemplateMap().get(paramName);
      BizException.error(paramValue != null, ReturnCodeEnum.INVALID_PARAMETER, paramName + "不能为空");
      // 添加到单条消息中参数列表
      singleMessageParams.add(paramValue.toString());
    }
    // 单条消息以逗号拼接成消息体
    return singleMessageParams.stream().collect(Collectors.joining(","));
  }

  /**
   * 获取相同内容群发接口消息内容
   * @param requestDto
   * @return
   */
  private String getSingleCommonSmsContent(MessageSendRequestDto requestDto) {
    return requestDto.getPhoneNo();
  }

  /**
   * 获取相同内容变量接口消息内容
   * @param requestDto
   * @return
   */
  private String getBatchVariableSmsContent(BatchMessageSendRequestDto requestDto, MNSChannelMessageTemplate template){
    // 查询消息模板中的变量名称列表
    List<TemplateParamDto> messageTemplateParams = messageTemplateParamManager.getByCode(template.getInnerTemplateNo());
    BizException.error(CollectionUtils.isNotEmpty(messageTemplateParams),
        ReturnCodeEnum.SYSTEM_ERROR, "变量模板顺序参数不能为空");

    // 把对象转换成变量名称字符串列表
    List<String> paramNames = messageTemplateParams.stream().map(v -> v.getParamName())
        .collect(Collectors.toList());

    // 获取请求参数短信内容列表
    List<SmsContentDto> dtos = requestDto.getSmsContentDtos();

    // 定义单条消息列表,列表内容为 手机号,变量值1,变量值2,变量值3...
    List<String> singleMessages = new ArrayList<>();

    // 遍历请求参数短信内容列表
    for (SmsContentDto dto : dtos) {
      // 定义单条消息中参数列表
      List<String> singleMessageParams = new ArrayList<>();
      // 第一个变量一定是手机号
      String phoneNo = dto.getPhoneNo();
      singleMessageParams.add(phoneNo);
      JSONObject templateParams = JSON.parseObject(dto.getTemplateParams());
      // 按照数据库定义的顺序查询模板变量的值
      for (String paramName : paramNames) {
        // 获取业务方传入的变量值
        String paramValue = templateParams.getString(paramName);
        // 添加到单条消息中参数列表
        singleMessageParams.add(paramValue);
      }
      // 单条消息以逗号拼接成消息体
      String singleMessage = singleMessageParams.stream().collect(Collectors.joining(","));
      singleMessages.add(singleMessage);
    }
    // 批量消息以分号拼接
    return singleMessages.stream().collect(Collectors.joining(";"));
  }

  /**
   * 获取相同内容群发接口消息内容
   * @param requestDto
   * @return
   */
  private String getBatchCommonSmsContent(BatchMessageSendRequestDto requestDto) {
    // 获取请求参数短信内容列表
    List<SmsContentDto> dtos = requestDto.getSmsContentDtos();

    // 相同内容群发接口以逗号拼接手机号
    return dtos.stream().map(v -> v.getPhoneNo()).collect(Collectors.joining(","));
  }

}
