package com.persagy.adm.diagram.core;

import com.fasterxml.jackson.databind.node.ObjectNode;
import com.persagy.adm.diagram.core.model.Diagram;
import com.persagy.adm.diagram.core.model.legend.Legend;
import com.persagy.adm.diagram.core.model.template.DiagramTemplate;
import com.persagy.adm.diagram.entity.DiagramType;

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

/**
 * IO策略接口
 *
 * @author zhaoyk
 */
public interface DataStrategy {

    String IMPL_QUALIFIER = "dataStrategyImpl";

    /**
     * 获取或有系统类型
     *
     * @return
     */
    List<DiagramType> getDiagramTypes();

    /**
     * 获取所有模板
     *
     * @return 列表
     */
    List<DiagramTemplate> getTemplates();

    /**
     * 根据系统图类型获取所有模板
     *
     * @param diagramType 系统图类型
     * @return 列表
     */
    List<DiagramTemplate> getTemplates(String diagramType);

    /**
     * 保存模板
     *
     * @param template 模板信息
     * @return 列表
     */
    DiagramTemplate saveTemplate(DiagramTemplate template);

    /**
     * 删除模板
     *
     * @param templateId 模板id
     * @return
     */
    boolean deleteTemplate(String templateId);

    /**
     * 根据模板id获取信息
     *
     * @param templateId 模板id
     * @return 模板信息
     */
    DiagramTemplate getTemplate(String templateId);


    /**
     * 根据系统code获取图例列表
     *
     * @param systemCode 系统code
     * @return 图例列表
     */
    List<Legend> getLegends(String systemCode);

    /**
     * 保存图例
     *
     * @param legend     图例信息
     * @param systemCode 系统code
     * @return 图例信息
     */
    Legend saveLegend(Legend legend, String systemCode);

    /**
     * 删除图例
     *
     * @param legendId   图例id
     * @param systemCode 系统code
     * @return 是否成功
     */
    boolean deleteLegend(String legendId, String systemCode);

    /**
     * 根据图例id 系统code 获取图例信息
     *
     * @param legendId   图例id
     * @param systemCode 系统code
     * @return 图例信息
     */
    Legend getLegend(String legendId, String systemCode);

    /**
     * 根据设备类型获取图例信息
     *
     * @param equipmentType 设备类型
     * @return
     */
    List<Legend> getLegendsForEquipment(String equipmentType);


    /**
     * 根据项目id 系统实例id 集团code 获取系统图列表
     *
     * @param projectId 项目id
     * @param systemId  系统实例id
     * @param groupCode 集团code
     * @return 列表数据
     */
    List<Diagram> getDiagrams(String projectId, String systemId, String groupCode);

    /**
     * 按系统图类型查询
     *
     * @param diagramType 系统图类型
     * @param projectId   项目id
     * @param systemId    系统实例id
     * @param groupCode   集团code
     * @param name        名称
     * @param flag        标识
     * @return 列表数据
     */
    List<Diagram> getDiagrams(String diagramType, String projectId, String systemId,
                              String groupCode, String name, Boolean flag);

    /**
     * 保存系统图
     *
     * @param diagram 系统图信息
     * @return 系统图信息
     */
    Diagram saveDiagram(Diagram diagram);

    /**
     * 删除系统图
     *
     * @param diagramId 系统图id
     * @return 是否成功
     */
    boolean deleteDiagram(String diagramId);

    /**
     * 根据系统id获取系统图信息
     *
     * @param diagramId 系统图id
     * @return 系统图数据
     */
    Diagram getDiagram(String diagramId);


    /**
     * 系统图数据
     *
     * @param equipmentTypes 设备类型列表
     * @param projectId      项目id
     * @param systemId       系统实例id
     * @param groupCode      集团code
     * @return 列表数据
     */
    List<ObjectNode> loadObjectsByType(List<String> equipmentTypes, String projectId, String systemId, String groupCode);

    /**
     * 根据关联类型、节点id列表、项目id 集团code获取信息
     *
     * @param relationTypes 关联类型列表
     * @param objectIds     节点id列表
     * @param projectId     项目id
     * @param groupCode     集团code
     * @return 列表数据
     */
    List<ObjectNode> loadRelationsByType(List<String[]> relationTypes, List<String> objectIds, String projectId, String groupCode);

    /**
     * 根据节点id列表、项目id、集团code获取列表数据
     *
     * @param objectIds 节点id列表
     * @param projectId 项目id
     * @param groupCode 集团code
     * @return 列表数据
     */
    List<ObjectNode> loadObjectsById(List<String> objectIds, String projectId, String groupCode);

    /**
     * 根据关联id列表 项目id 集团code获取关联数据
     *
     * @param relationIds 关联关系id列表
     * @param projectId   项目id
     * @param groupCode   集团code
     * @return 列表数据
     */
    List<ObjectNode> loadRelationsById(List<String> relationIds, String projectId, String groupCode);

    /**
     * 获取所有系统实例
     *
     * @param projectId 项目id
     * @param groupCode 集团code
     * @return 实例列表
     */
    List<ObjectNode> loadSystemInstance(String projectId, String groupCode);

    /**
     * 项目下的专业 -> 系统 ->系统实例 的树状结构数据
     *
     * @return 列表
     */
    List<ObjectNode> loadMajorSystemInstance();

    /**
     * 根据系统类获取系统类型下的模板列表  以树状结构数据返回
     *
     * @param diagram diagram.getSystem() 参数
     * @return
     */
    List<ObjectNode> loadSystemTypeTemplate(Diagram diagram);

    /**
     * 更新系统图状态
     *
     * @param state 状态
     * @param id
     * @return
     */
    boolean updateState(String state, String id);

    /**
     * 获取系统实例下是否有系统图
     *
     * @return 例如： {"系统图实例id1":true,"系统图实例id2":false}
     */
    Map<String, Boolean> querySystemInstanceDiagramList();
}
