package com.persagy.proxy.object.service;

import com.alibaba.fastjson.JSONObject;
import com.persagy.proxy.adm.request.AdmDCSQueryRequest;
import com.persagy.proxy.adm.request.AdmQueryCriteria;
import com.persagy.proxy.adm.request.AdmResponse;
import com.persagy.proxy.adm.service.IAdmBaseService;
import com.persagy.proxy.common.entity.InstanceUrlParam;
import com.persagy.proxy.object.model.AdmSpace;

import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * ADM 空间 接口
 * @author lvxy
 * @date 2021/8/18
 */
public interface IAdmSpaceService extends IAdmBaseService<AdmSpace> {

    /**
     * 新增
     * @param context
     * @param clazz
     * @param voList
     * @return
     */
    List<AdmSpace> doInsertExt(InstanceUrlParam context, Class<AdmSpace> clazz, List<AdmSpace> voList);

    /**
     * 查询业务空间所有类型
     */
    AdmResponse doQueryType(InstanceUrlParam context, AdmDCSQueryRequest request);
    /**
     * 查询业务空间 级联查询：建筑（buildingList），楼层（floorlList），空间类型（objectType）未明确楼层(isnull),未明确建筑(isnull)
     */
    AdmResponse doQuerySpaces(InstanceUrlParam context, AdmDCSQueryRequest request);
    List<JSONObject> doQuerySpaceTypes(InstanceUrlParam context);

    /**
     * 查询指定竖井下指定空间类型的空间
     * @param context
     * @param shaftId
     * @param spaceType
     * @return
     */
    List<AdmSpace> querySpaceInShaft(InstanceUrlParam context, String shaftId, String spaceType);

    /**
     * 查询指定建筑下指定空间类型的空间
     * @param context
     * @param buildingId
     * @param spaceType
     * @return
     */
    List<AdmSpace> querySpaceInBuilding(InstanceUrlParam context, String buildingId, String spaceType);

    /**
     * 查询楼层与空间关系映射
     * @param context
     * @param floorIds
     * @param spaceType
     * @return Map<FloorID, List<SpaceID>>
     */
    Map<String, List<String>> querySpaceMapInFloors(InstanceUrlParam context, List<String> floorIds, String spaceType);

    /**
     * 查询垂直交通关系映射
     * @param context
     * @param spaceIds
     * @return
     */
    Map<String, Set<String>> queryTrafficSpaceMap(InstanceUrlParam context, Iterable<String> spaceIds, String spaceType);
    void ensureSpecialValues(InstanceUrlParam context, List<AdmSpace> vos);
    /***
     * Description: 查询多建筑楼层下的空间id
     * @param request : 请求参数
     * @return : java.util.Set<java.lang.String>
     * @author : lijie
     * @date :2021/10/28 17:56
     * Update By lijie 2021/10/28 17:56
     */
    Set<String> queryMultiBuildingOrFloorSpaceIds(HttpServletRequest request);
    /***
     * Description: 查询多建筑楼层下的空间列表
     * @param request : 请求参数
     * @return : java.util.Set<java.lang.String>
     * @author : lijie
     * @date :2021/10/28 17:56
     * Update By lijie 2021/10/28 17:56
     */
    AdmResponse queryMultiBuildingOrFloorSpaces(HttpServletRequest request);
    /***
     * Description: 根据查询条件查询空间统计数据
     * @param request : 请求参数
     * @return : com.persagy.proxy.adm.request.AdmResponse
     * @author : lijie
     * @date :2021/10/28 21:07
     * Update By lijie 2021/10/28 21:07
     */
    AdmResponse query(AdmQueryCriteria request);

    /**
     * 修改空间轮廓线
     */
    AdmResponse updateOutLine(List<AdmSpace> vos);

    AdmResponse doUpdate(List<AdmSpace> vos);

    /**
     * 处理关系计算
     */
    void processRelationType(InstanceUrlParam context,List<AdmSpace> vos);
}
