package com.persagy.dmp.digital.client;

import cn.hutool.extra.spring.SpringUtil;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.persagy.dmp.basic.dto.RequestData;
import com.persagy.dmp.basic.model.QueryCriteria;
import com.persagy.dmp.common.model.response.CommonResult;
import com.persagy.dmp.common.utils.ResultHelper;
import com.persagy.dmp.define.entity.ObjectTypeDefine;
import com.persagy.dmp.digital.entity.ObjectDigital;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;
import java.util.Set;

/**
 * 物理世界对象Client门面
 * @author Charlie Yu
 * @date 2021-05-15
 */
public class DigitalObjectFacade {

    private static DigitalObjectClient client = SpringUtil.getBean(DigitalObjectClient.class);

    /**
     * 根据项目id批量查询项目信息
     * @param groupCode: 集团编码
     * @param projectId: 项目ID
     * @param appId: 应用ID
     * @param userId: 用户ID
     * @param projectIds: 项目id数组
     * @return 对象数组
     */
    public static List<ObjectDigital> batchQueryProjectByIds(String groupCode, String projectId, String appId,
                                                             String userId, Set<String> projectIds) {
        CommonResult<List<ObjectDigital>> result = client.batchQueryProjectByIds(groupCode, projectId, appId,
                userId, projectIds);
        return ResultHelper.getContent(result);
    }
    /**
     * 根据项目id批量查询项目信息
     * @param groupCode: 集团编码
     * @param projectId: 项目ID
     * @param appId: 应用ID
     * @param userId: 用户ID
     * @param projectIds: 项目id数组
     * @return 原样返回结果
     */
    public static CommonResult<List<ObjectDigital>> batchQueryProjectByIdsPrototype(String groupCode, String projectId, String appId,
                                                             String userId, Set<String> projectIds) {
        return client.batchQueryProjectByIds(groupCode, projectId, appId,
                userId, projectIds);
    }
    /**
     * 根据管理分区id批量查询项目信息
     * @param groupCode: 集团编码
     * @param projectId: 项目ID
     * @param appId: 应用ID
     * @param userId: 用户ID
     * @param requestData: 请求参数
     * @return 对象数组
     */
    public static List<ObjectDigital> batchQueryProjectByGroupManageZoneIds(String groupCode, String projectId, String appId,
                                                             String userId, RequestData requestData) {
        CommonResult<List<ObjectDigital>> result = client.batchQueryProjectByGroupManageZoneIds(groupCode, projectId, appId,
                userId, requestData);
        return ResultHelper.getContent(result);
    }
    /**
     * 根据管理分区id批量查询项目信息
     * @param groupCode: 集团编码
     * @param projectId: 项目ID
     * @param appId: 应用ID
     * @param userId: 用户ID
     * @param requestData: 请求参数
     * @return 原样返回结果
     */
    public static CommonResult<List<ObjectDigital>> batchQueryProjectByGroupManageZoneIdsPrototype(String groupCode, String projectId, String appId,
                                                             String userId, RequestData requestData) {
        return client.batchQueryProjectByGroupManageZoneIds(groupCode, projectId, appId,
                userId, requestData);
    }
    /**
     * 查询物理世界对象
     * @param groupCode: 集团编码
     * @param projectId: 项目ID
     * @param appId: 应用ID
     * @param userId: 用户ID
     * @param criteria: 请求参数
     * @return 对象数组
     */
    public static List<ObjectNode> query(String groupCode, String projectId, String appId,
                                         String userId, QueryCriteria criteria) {
        CommonResult<List<ObjectNode>> result = client.query(groupCode, projectId, appId, userId, criteria);
        return ResultHelper.getContent(result);
    }
    /**
     * 查询物理世界对象
     * @param groupCode: 集团编码
     * @param projectId: 项目ID
     * @param appId: 应用ID
     * @param userId: 用户ID
     * @param criteria: 请求参数
     * @return 原样查询结果
     */
    public static CommonResult<List<ObjectNode>> queryPrototype(String groupCode, String projectId, String appId,
                                                       String userId, QueryCriteria criteria) {
        return client.query(groupCode, projectId, appId, userId, criteria);
    }
    /**
     * 新增物理世界对象-单个新增
     * @param groupCode: 集团编码
     * @param projectId: 项目ID
     * @param appId: 应用ID
     * @param userId: 用户ID
     * @param node: 新增对象
     * @return 对象
     */
    public static ObjectDigital createOne(String groupCode, String projectId, String appId,
                                                             String userId, ObjectNode node) {
        CommonResult<ObjectDigital> result = client.createOne(groupCode, projectId, appId, userId, node);
        return ResultHelper.getContent(result);
    }
    /**
     * 新增物理世界对象-批量新增
     * @param groupCode: 集团编码
     * @param projectId: 项目ID
     * @param appId: 应用ID
     * @param userId: 用户ID
     * @param nodes: 新增对象集合
     * @return 对象数组
     */
    public static List<ObjectDigital> create(String groupCode, String projectId, String appId,
                                                             String userId, List<ObjectNode> nodes) {
        CommonResult<List<ObjectDigital>> result = client.create(groupCode, projectId, appId, userId, nodes);
        return ResultHelper.getContent(result);
    }
    /**
     * 更新物理世界对象-单个更新
     * @param groupCode: 集团编码
     * @param projectId: 项目ID
     * @param appId: 应用ID
     * @param userId: 用户ID
     * @param node: 更新对象
     * @return 对象
     */
    public static ObjectDigital updateOne(String groupCode, String projectId, String appId,
                                                             String userId, ObjectNode node) {
        CommonResult<ObjectDigital> result = client.updateOne(groupCode, projectId, appId, userId, node);
        return ResultHelper.getContent(result);
    }
    /**
     * 更新物理世界对象-批量更新
     * @param groupCode: 集团编码
     * @param projectId: 项目ID
     * @param appId: 应用ID
     * @param userId: 用户ID
     * @param nodes: 更新对象集合
     * @return 对象数组
     */
    public static List<ObjectDigital> update(String groupCode, String projectId, String appId,
                                                             String userId, List<ObjectNode> nodes) {
        CommonResult<List<ObjectDigital>> result = client.update(groupCode, projectId, appId, userId, nodes);
        return ResultHelper.getContent(result);
    }
    /**
     * 删除物理世界对象-单个删除
     * @param groupCode: 集团编码
     * @param projectId: 项目ID
     * @param appId: 应用ID
     * @param userId: 用户ID
     * @param id: 对象id
     * @return 对象
     */
    public static void deleteOne(String groupCode, String projectId, String appId,
                                                             String userId, String id) {
        client.deleteOne(groupCode, projectId, appId, userId, id);
    }
    /**
     * 删除物理世界对象-批量删除
     * @param groupCode: 集团编码
     * @param projectId: 项目ID
     * @param appId: 应用ID
     * @param userId: 用户ID
     * @param ids: 对象id数组
     * @return 对象数组
     */
    public static void delete(String groupCode, String projectId, String appId,
                                                             String userId, List<String> ids) {
        client.delete(groupCode, projectId, appId, userId, ids);
    }
    /**
     * 根据上级id查询下级关联对象
     * @param groupCode: 集团编码
     * @param projectId: 项目ID
     * @param appId: 应用ID
     * @param userId: 用户ID
     * @param requestData: 请求参数
     * @return void
     */
    public static List<ObjectDigital> queryObjectListSuperiorId(String groupCode, String projectId, String appId, String userId, RequestData requestData) {
        CommonResult<List<ObjectDigital>> commonResult = client.queryObjectListSuperiorId(groupCode, projectId, appId, userId, requestData);
        return commonResult.getData();
    }
    /**
     * 根据上级id查询下级关联对象
     * @param groupCode: 集团编码
     * @param projectId: 项目ID
     * @param appId: 应用ID
     * @param userId: 用户ID
     * @param requestData: 请求参数
     * @return void
     */
    public static CommonResult<List<ObjectDigital>> queryObjectListSuperiorIdPrototype(String groupCode, String projectId, String appId, String userId, RequestData requestData) {
        return client.queryObjectListSuperiorId(groupCode, projectId, appId, userId, requestData);
    }
    /**
     * 根据图类型编码及关系类型编码查询对象及其关联对象
     * @param groupCode: 集团编码
     * @param projectId: 项目ID
     * @param appId: 应用ID
     * @param userId: 用户ID
     * @param requestData: 请求参数
     * @return void
     */
    public static List<ObjectDigital> queryObjectListByGraphCodeAndRelCode(String groupCode,
                                                                           String projectId,
                                                                           String appId,
                                                                           String userId,
                                                                           RequestData requestData) {
        CommonResult<List<ObjectDigital>> commonResult = client.queryObjectListByGraphCodeAndRelCode(groupCode,
                projectId, appId, userId, requestData);
        return commonResult.getData();
    }
    /**
     * 根据图类型编码及关系类型编码查询对象及其关联对象
     * @param groupCode: 集团编码
     * @param projectId: 项目ID
     * @param appId: 应用ID
     * @param userId: 用户ID
     * @param requestData: 请求参数
     * @return void
     */
    public static CommonResult<List<ObjectDigital>> queryObjectListByGraphCodeAndRelCodePrototype(String groupCode,
                                                                           String projectId,
                                                                           String appId,
                                                                           String userId,
                                                                           RequestData requestData) {
        return client.queryObjectListByGraphCodeAndRelCode(groupCode,
                projectId, appId, userId, requestData);
    }
    /**
     * 根据图类型编码及关系类型编码查询对象及其关联对象
     * @param groupCode: 集团编码
     * @param projectId: 项目ID
     * @param appId: 应用ID
     * @param userId: 用户ID
     * @param objectDigitals: 请求参数
     * @return void
     */
    public static CommonResult<List<ObjectDigital>> batchUpdateClassCodesByIds(String groupCode,
                                                                           String projectId,
                                                                           String appId,
                                                                           String userId, List<ObjectDigital> objectDigitals) {
        return client.batchUpdateClassCodesByIds(groupCode,
                projectId, appId, userId, objectDigitals);
    }
}
