package com.persagy.proxy.adm.strategy.relationdata;

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

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.persagy.dmp.basic.dto.RequestData;
import com.persagy.dmp.common.helper.SpringHelper;
import com.persagy.dmp.digital.entity.ObjectDigital;
import com.persagy.proxy.adm.constant.AdmRelationTypeEnum;
import com.persagy.proxy.report.model.AdmRelationObject;

/**
 * 
 * @version 1.0.0
 * @company persagy 
 * @author zhangqiankun
 * @date 2021年9月2日 下午10:46:03
 */
public interface RelationObjectStrategy {

	String WHERE_IN = "$in";
	
	String OBJ_TYPE = "objType";
	
	ObjectMapper OBJECT_MAPPER = SpringHelper.getBean(ObjectMapper.class);
	
	static Map<String, String> OBJNAME_2_TYPE = new HashMap<String,String>(){
		private static final long serialVersionUID = 1L;
		{
            put("对象ID", "id");
            put("对象名称", "name");
            put("对象本地编码", "localId");
            put("对象本地名称", "localName");
            put("设计图纸中编码", "cADID");
        }
    };
    
	/**
	 * 统计关系总数
	 * 
	 * @param groupCode
	 * @param projectId
	 * @return
	 */
    long countRelationObjects(String groupCode, String projectId, AdmRelationTypeEnum typeEnum);
    
	/**
	 * 查询出所有的关系信息
	 * 
	 * @param groupCode 集团编码
	 * @param projectId 项目ID
	 * @return 不会返回null
	 */
	List<AdmRelationObject> exportRelationObject(String groupCode, String projectId);
	
	/**
	 * 查询出所有的关系对象数据
	 * 
	 * @param groupCode 集团编码
	 * @param projectId 项目ID
	 * @param mainContent	主对象的筛选关键字,筛选范围为id,name,local_id,local_name,cADID.为关系左侧对象
	 * @param slaveContent	从对象的筛选关键字.objTo对应的对象,筛选范围为id,name,local_id,local_name.为关系右侧对象
	 * @return 不会返回null
	 */
	List<ObjectDigital> queryAllRelations(String groupCode, String projectId, String mainContent, Set<String> slaveContent, AdmRelationTypeEnum typeEnum);
	
	/**
	 * 分页查询关系对象数据
	 * 
	 * @param masterObjs 查询的数据集存储地方
	 * @param requestData 请求参数
	 * @param groupCode 集团编码
	 * @param projectId 项目ID
	 */
	void queryPageRelations(List<ObjectDigital> masterObjs, RequestData requestData, String groupCode, String projectId);
	
	/**
	 * 保存之前会校验数据的合法性
	 * 
	 * @param relationObject 需要校验的对象
	 * @param groupCode
	 * @param projectId
	 * @param code 参考 OBJNAME_2_TYPE
	 * @param typeEnum 
	 * @return String - 校验失败的原因， ObjectNode -- BDTP接口的参数，不会返回null，请用instanceOf 判断返回值
	 */
	Object beforeSaveRelationObject(AdmRelationObject relationObject, String groupCode, String projectId, String code, AdmRelationTypeEnum typeEnum);
	/**
	 * 检查关系对象数据的正确性，并完成额外字段的赋值功能
	 *
	 * @param relationTypeEnum AdmRelationTypeEnum枚举类
	 * @param code
	 * @return String - 校验失败的原因， ObjectNode -- BDTP接口的参数，不会返回null，请用instanceOf 判断返回值
	 */
	Map<String,Object> beforeSaveRelationObjects(List<AdmRelationObject> relationObjects, String groupCode,
												 String projectId, String code, AdmRelationTypeEnum relationTypeEnum);

	/**
	 * 保存对象之间的关系
	 * 
	 * @param relationObject
	 * @param groupCode
	 * @param projectId
	 * @return 
	 */
	boolean saveRelationObject(ObjectNode relationObject, String groupCode, String projectId);
	
	/**
	 * 批量保存对象之间的关系
	 * 
	 * @param relationObjects
	 * @param groupCode
	 * @param projectId
	 * @return 
	 */
	boolean saveRelationObjects(List<ObjectNode> relationObjects, String groupCode, String projectId);

}
