package com.persagy.proxy.report.service;

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

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.persagy.dmp.basic.model.QueryCriteria;
import com.persagy.dmp.define.entity.GraphDefine;
import com.persagy.dmp.define.entity.ObjectInfoDefine;
import com.persagy.dmp.define.entity.ObjectTypeDefine;
import com.persagy.dmp.define.entity.RelationDefine;
import com.persagy.dmp.digital.entity.ObjectRelation;
import lombok.SneakyThrows;

/**
 * 报表/模板下载
 * 
 * @version 1.0.0
 * @company persagy 
 * @author zhangqiankun
 * @date 2021年8月31日 下午4:42:51
 */
public interface IRelationReportService {
	
	/**
	 * 获取class类型定义数据
	 * 
	 * @param groupCode
	 * @param projectId
	 * @param classCodes
	 * @param objTypes
	 * @param orderItems
	 * @return
	 */
	List<ObjectTypeDefine> queryClassList(String groupCode, String projectId, Set<String> classCodes, Set<String> objTypes, List<OrderItem> orderItems);
	
	/**
	 * 根据信息点统计对象个数
	 * 
	 * @param groupCode
	 * @param classCodes
	 * @param objTypes
	 * @param groups
	 * @return
	 */
	List<Map<String,Object>> queryObjectCountByObjInfos(String groupCode, Set<String> classCodes, Set<String> objTypes, List<String> groups);
	
	/**
	 * 根据条件查询对应的图类型数据
	 * 
	 * @param groupCode
	 * @param projectId
	 * @param graphCode
	 */
	List<GraphDefine> getGraphDefine(String groupCode, String projectId, String graphCode);
	
	/**
	 * 根据条件查询对应的边类型数据
	 * 
	 * @param groupCode
	 * @param projectId
	 * @param graphCode
	 * @param relCode
	 */
	List<RelationDefine> getRelationDefine(String groupCode, String projectId, String graphCode, String relCode);

	/**
	 * 获取所有的项目计算二级树数据
	 * 
	 * @param groupCode
	 * @param projectId
	 * @return
	 */
	List<JSONObject> getAllRelationProjectCalTree(String groupCode, String projectId);
	
	/**
	 * 获取所有的项目计算数据
	 * 
	 * @param queryCriteria
	 * @param groupCode
	 * @param projectId
	 * @return
	 */
	List<JSONObject> getAllRelationProjectCal(QueryCriteria queryCriteria, String groupCode, String projectId);
	
	/**
	 * 获取项目计算关系
	 * 
	 * @param groupCode
	 * @param projectId
	 * @param relType	ADM-类型
	 * @return
	 */
	JSONObject getRelationProjectCal(String groupCode, String projectId, String relType);
	
	/**
	 * 获取项目计算关系
	 * 
	 * @param groupCode
	 * @param projectId
	 * @param graphCode
	 * @param relCode
	 * @param zoneType
	 * @return
	 */
	ObjectNode getRelationProjectCal(String groupCode, String projectId, String graphCode, String relCode, String zoneType);
	
	/**
	 * 统计某类型下的关系数量
	 * 
	 * @param groupCode
	 * @param projectId
	 * @param graphCode
	 * @param relCode
	 * @param zoneType 业务分区类型
	 */
	long countRelationObject(String groupCode, String projectId, String graphCode, String relCode, String zoneType);
	
	/**
	 * 统计某类型下的对象数量
	 * 
	 * @param groupCode
	 * @param projectId
	 * @param classCode
	 * @param objType
	 * @return
	 */
	long countObject(String groupCode, String projectId, String classCode, String objType);
	
	/**
	 * 获取指定对象信息
	 * 
	 * @param groupCode
	 * @param projectId
	 * @param ids
	 * @return 不会返回null
	 */
	List<ObjectNode> getObjectNode(ObjectNode criteria, String groupCode, String projectId, Set<String> ids);
	
	/**
	 * 获取指定对象信息
	 * <p>定制接口，不建议兼容额外的处理方案</p>
	 * 
	 * @param groupCode
	 * @param projectId
	 * @param objType
	 * @param code	ADM-中的code类型，请参考{@link com.persagy.proxy.adm.strategy.relationdata.QueryRelationObjectStrategy#OBJNAME_2_TYPE}
	 * @param value 属性值
	 * @return
	 */
	List<ObjectNode> findObjectNodes(String groupCode, String projectId, String objType, String code, String value);
	
	/**
	 * 获取对象，通过关系对象的id和rel_code
	 * 
	 * @param groupCode
	 * @param projectId
	 * @param graphCode
	 * @param relCode
	 * @param objFrom 与objTo不可同时存在
	 * @param objTo	  与objFrom不可同时存在
	 * @return 不会返回null
	 */
	ObjectNode getObjectByCodeAndId(String groupCode, String projectId, String graphCode, String relCode, String objFrom, String objTo);
	
	/**
	 * 获取原始的对象数据
	 * 
	 * @param criteria
	 * @param groupCode
	 * @param projectId
	 * @param ids
	 * @param classCodes
	 * @param objTypes
	 * @param orderItem
	 * @return
	 */
	List<ObjectNode> queryObjects(ObjectNode criteria, String groupCode, String projectId, Set<String> ids, Set<String> classCodes, 
			Set<String> objTypes, List<OrderItem> orderItem);
	
	/**
	 * 获取原始的对象关系数据
	 * 
	 * @param groupCode
	 * @param projectId
	 * @param graphCode
	 * @param relCode
	 * @param objFroms
	 * @param objTos
	 * @return
	 */
	List<ObjectRelation> findRelationObjects(String groupCode, String projectId, String graphCode, String relCode, Set<String> objFroms, Set<String> objTos);
	
	/**
	 * 查询信息点定义
	 * 
	 * @param groupCode
	 * @param projectId
	 * @param classCodes
	 * @param code
	 * @param category
	 * @return
	 */
	List<ObjectInfoDefine> queryFunidList(String groupCode, String projectId, Set<String> classCodes, String code, String category);

	/**
	 * 查询关系总览（空表，先插入）
	 * @param content: 模糊查询卡片名称关键字
	 */
	JSONObject overview(String content) throws JsonProcessingException;
	
	/**
	 * 初始化项目关系计算数据
	 * 
	 * @param groupCode: 集团编码
	 * @param projectId: 项目id
	 * @return
	 */
	boolean createRelationProjectCal(String groupCode, String projectId) throws JsonProcessingException;
	/***
	 * Description: 根据对象类型编码集合查询类型定义映射
	 * @param classCodes : 对象类型编码集合
	 * @return : java.util.Map<java.lang.String,com.persagy.dmp.define.entity.ObjectTypeDefine>
	 * @author : lijie
	 * @date :2021/11/17 15:24
	 * Update By lijie 2021/11/17 15:24
	 */
    Map<String, ObjectTypeDefine> queryDefineTypeMapByClassCodes(Set<String> classCodes);
	/***
	 * Description:
	 * @param primaryKey : 信息点key
	 * @param primaryMess : 信息点的值
	 * @param classCodes : 对象类型code集合
	 * @return : java.util.Map<java.lang.String,java.util.List<com.fasterxml.jackson.databind.node.ObjectNode>>
	 * @author : lijie
	 * @date :2021/11/16 16:34
	 * Update By lijie 2021/11/16 16:34
	 */
	Map<String, List<ObjectNode>> queryEquipsByConditions(String primaryKey, Set<String> primaryMess,
														  Set<String> classCodes);
	/***
	 * Description: 根据设备类型编码集合查询映射关系
	 * @param classCodes : 设备类型编码集合
	 * @return : java.util.Map<java.lang.String,java.util.List<com.persagy.dmp.digital.entity.ObjectDigital>>
	 * @author : lijie
	 * @date :2021/11/16 16:25
	 * Update By lijie 2021/11/16 16:25
	 */
	Map<String, List<ObjectNode>> queryEquipsByClassCodes(Set<String> classCodes);
	/***
	 * Description: 根据设备类型code集合查询信息点定义
	 * @param classCodes : 设备类型code集合
	 * @return : java.util.Map<java.lang.String,java.util.List<com.persagy.dmp.define.entity.ObjectInfoDefine>>
	 * @author : lijie
	 * @date :2021/11/16 16:18
	 * Update By lijie 2021/11/16 16:18
	 */
	Map<String, List<ObjectInfoDefine>> queryDefineInfoMapByClassCodes(Set<String> classCodes);
	/**
	 * 获取指定对象信息
	 * <p>定制接口，不建议兼容额外的处理方案</p>
	 *
	 * @param groupCode： 集团编码
	 * @param projectId： 项目id
	 * @param objTypes： 对象类型集合
	 * @param infoKey:	信息点key
	 * @param codes： 信息点值集合
	 * @return
	 */
	Map<String, List<ObjectNode>> findObjectNodesByPage(String groupCode, String projectId, Set<String> objTypes, String infoKey, Set<String> codes);
}
