package cn.gov.customs.wxjy.ibmmq.config;

import cn.gov.customs.wxjy.ibmmq.enums.BillTypeEnum;
import cn.gov.customs.wxjy.ibmmq.model.DataMessage;
import cn.gov.customs.wxjy.ibmmq.utils.IbmmqSendUtils;
import jodd.util.StringUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * 推送数据和文件构造函数对象
 * DataMessage<T> message 推送数据对象
 * DataMessage<T> flowMessage 推送流程记录对象
 * PushContext context 推送日志对象
 * List<String> attachments 推送附件集合
 * @param <T>
 */
@Slf4j
public class DataMessageBuilder<T> {
    private final DataMessage<T> message = new DataMessage<>();
    private final PushContext context;
    private List<String> attachments = new ArrayList<>();

    private DataMessageBuilder(PushContext context) {
        this.context = context;
    }

    public static <T> DataMessageBuilder<T> create(PushContext context) {
        return new DataMessageBuilder<>(context);
    }

    /**
     * 单个数据传输
     * @param data 传输数据对象
     * @return
     */
    public DataMessageBuilder<T> withData(T data) {
        List<T> dataList = new ArrayList<>();
        if (data instanceof List) {
            // 处理列表类型
            dataList = (List<T>) data;
        } else {
            // 处理单个对象
            dataList.add(data);
        }
        message.setDataList(dataList);
        return this;
    }

    /**
     * 设置mapperClassName
     * @param mapperClassName
     * @return
     */
    public DataMessageBuilder<T> withMapperClassName(String mapperClassName) {
        if(StringUtil.isNotEmpty(mapperClassName)){
            message.setMapperClassName(mapperClassName);
        }
        return this;
    }

    /**
     * 添加多个附件
     * @param attachments
     * @return
     */
    public DataMessageBuilder<T> withAttachments(List<String> attachments) {
        if(CollectionUtils.isNotEmpty(attachments)) {
            this.attachments.addAll(attachments);
        }
        return this;
    }

    /**
     * 设置操作数据类型：如：insert、updata、delete
     * @param method
     * @return
     */
    public DataMessageBuilder<T> withMethod(String method) {
        if(StringUtil.isNotEmpty(method)){
            message.setMethodName(method);
        }
        return this;
    }

    public DataMessageBuilder<T> withMethodParamTypes(Class<?>[] methodParamTypes) {
        message.setMethodParamTypes(methodParamTypes);
        return this;
    }

    /**
     * 指定要提取的属性名
     * 针对要执行的方法形参为POJO内的特定属性，如按ID删除时，需要填写"ID"，如果参数为数据对象，则不需要填写
     */
    public DataMessageBuilder<T> withPropertyName(String propertyName) {
        message.setPropertyName(propertyName);
        return this;
    }


    /**
     * 推送数据
     * 若流程记录对象不为空，则推送
     * 若附件对象不为空，则推送
     */
    public void send() {
        // 主数据消息发送
        log.warn("【"+ BillTypeEnum.getNameByCode(context.getBusType())+"】数据：推送开始");
        IbmmqSendUtils.sendData(message, context);
		log.warn("【"+BillTypeEnum.getNameByCode(context.getBusType())+"】数据：推送结束");
        // 附件信息发送（如果有）
        if (CollectionUtils.isNotEmpty(attachments)) {
			log.warn("【"+BillTypeEnum.getNameByCode(context.getBusType())+"】附件数据：推送开始");
            IbmmqSendUtils.sendFile(attachments, context);
			log.warn("【"+BillTypeEnum.getNameByCode(context.getBusType())+"】附件数据：推送结束");
        }
    }



}
