package cn.axzo.msg.center.utils;

import cn.axzo.msg.center.common.utils.BeanConvertUtils;
import cn.axzo.msg.center.common.utils.PlaceholderResolver;
import cn.axzo.msg.center.service.dto.MessageCardContentItemDTO;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;

import java.util.List;
import java.util.stream.Collectors;

/**
 * @description
 *   消息卡片信息工具方法
 *
 * @author cold_blade
 * @date 2023/11/10
 * @version 1.0
 */
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class MessageCardUtil {

    /**
     * 解析模板上配置的卡片信息，并替换其中的动态参数
     *
     * @param msgCardContentItems 路由信息
     * @param bizExtParamStr  业务扩展参数
     * @return List<MessageCardContentItemDTO>
     */
    public static List<MessageCardContentItemDTO> parseMessageCard(List<MessageCardContentItemDTO> msgCardContentItems,
                                                                   String bizExtParamStr) {
        if (CollectionUtils.isNotEmpty(msgCardContentItems) && StringUtils.isNotBlank(bizExtParamStr)) {
            JSONObject bizExtParam = JSON.parseObject(bizExtParamStr);
            // 复制一个副本，避免直接修改
            msgCardContentItems = BeanConvertUtils.copyList(msgCardContentItems, MessageCardContentItemDTO.class);
            msgCardContentItems.forEach(e -> {
                String modifiedValue = PlaceholderResolver.getDefaultResolver().resolveByMap(e.getValue(), bizExtParam);
                e.setValue(modifiedValue);
            });
            return filterParsedCardItemsByValues(msgCardContentItems);
        }
        return msgCardContentItems;
    }

    /**
     * 过滤空值的卡片
     */
    public static List<MessageCardContentItemDTO> filterParsedCardItemsByValues(
            List<MessageCardContentItemDTO> items) {
        if (CollectionUtils.isEmpty(items)) {
            return items;
        }
        return items.stream()
                .filter(item -> {
                    String value = item.getValue();
                    return StringUtils.isNotBlank(value) && !"null".equalsIgnoreCase(value);
                })
                .collect(Collectors.toList());
    }

}