package com.xisc.pm.app.service;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.type.CollectionType;
import io.choerodon.core.exception.CommonException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;

/**
 * fileName: InterfaceReceiveExecuteService
 * description:
 * history:
 *
 * @author 张建元 jianyuan.zhang@hand-china.com
 * @version 1.0.0
 * @since 2024-08-28 17:04
 */
public interface InterfaceReceiveExecuteService {
    Logger LOGGER = LoggerFactory.getLogger(InterfaceReceiveExecuteService.class);

    /**
     * 二级接口接收执行
     *
     * @param tenantId        租户ID
     * @param interfaceCode   二级接口CODE
     * @param interfaceData   接口数据
     */
    void execute(Long tenantId, String interfaceCode, String interfaceData);


    /**
     * 将字符串转换为实体列表。
     *
     * @param interfaceCode 二级接口CODE
     * @param interfaceData 待转换的字符串数据，它应该包含能够被转换为实体列表的必要信息。
     * @param clazz         目标实体类的Class对象，用于指定转换后的对象类型。
     * @param <T>           泛型参数，表示转换后的实体类型。
     * @return 返回通过字符串数据转换得到的实体列表。
     * @throws CommonException 如果interfaceData解析对象集合失败，将抛出此异常。
     */
    default <T> List<T> strToEntityList(String interfaceCode, String interfaceData, Class<T> clazz) {
        validateContextIsJson(interfaceCode, interfaceData);
        ObjectMapper objectMapper = new ObjectMapper();
        List<T> resultList;
        try {
            // 尝试将JSON字符串转换为实体列表
            CollectionType collectionType = objectMapper.getTypeFactory().constructCollectionType(List.class, clazz);
            resultList = objectMapper.readValue(interfaceData, collectionType);
        } catch (Exception e) {
            LOGGER.error("传入参数解析对象集合失败, 请求参数: 二级接口CODE={};二级接口数据={};异常信息={}", interfaceCode, interfaceData, e.getMessage(), e);
            throw new CommonException("传入参数解析对象集合失败，请检查！");
        }
        return resultList;
    }


    /**
     * 验证上下文是否为JSON格式。
     *
     * @param interfaceCode 二级接口CODE
     * @param interfaceData 待验证的事件上下文字符串。
     * @throws CommonException 如果interfaceData不是一个有效的JSON字符串，将抛出此异常。
     */
    default void validateContextIsJson(String interfaceCode, String interfaceData) {
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            // 尝试将字符串解析为JSON树，如果成功则说明字符串是有效的JSON格式
            objectMapper.readTree(interfaceData);
        } catch (JsonProcessingException e) {
            LOGGER.error("验证接口数据是否为JSON格式失败, 请求参数: 二级接口CODE={};二级接口数据={};异常信息={}", interfaceCode, interfaceData, e.getMessage(), e);
            throw new CommonException("传入参数非JSON格式，请检查！");
        }
    }
}
