package com.persagy.adm.diagram.controller;

import com.fasterxml.jackson.databind.node.ObjectNode;
import com.persagy.adm.diagram.core.DataStrategy;
import com.persagy.adm.diagram.core.model.Diagram;
import com.persagy.adm.diagram.core.model.template.DiagramTemplate;
import com.persagy.adm.diagram.frame.BdtpRequest;
import com.persagy.dmp.common.model.response.CommonResult;
import com.persagy.dmp.common.utils.ResultHelper;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * 系统图相关接口
 *
 * @author liyang
 * @date 2022-01-04
 */
@RestController
@CrossOrigin
@RequestMapping("/diagram")
public class DiagramController {

    @Autowired
    @Qualifier("dataStrategyImpl")
    private DataStrategy dataStrategy;

    /**
     * 系统图列表接口
     *
     * @param diagram 请求参数
     * @return 系统图列表
     */
    @ApiOperation("系统图列表接口")
    @PostMapping("/getDiagrams")
    public CommonResult<List<Diagram>> getDiagrams(@RequestBody Diagram diagram) {
        BdtpRequest current = BdtpRequest.getCurrent();
        String groupCode = current.getGroupCode();
        String projectId = current.getProjectId();

        List<Diagram> diagramList = dataStrategy.getDiagrams(null, projectId,
                diagram.getSystemId(), groupCode, diagram.getName());

        return ResultHelper.multi(diagramList);
    }

    /**
     * 新增系统图
     *
     * @param diagram 系统图对象信息
     * @return 是否成功
     */
    @ApiOperation("新增系统图")
    @PostMapping("/newDiagram")
    public CommonResult<Diagram> newDiagram(@RequestBody Diagram diagram) {
        return ResultHelper.single(dataStrategy.saveDiagram(diagram));
    }

    /**
     * 系统图删除功能
     *
     * @param diagramId 系统图id
     * @return 是否成功
     */
    @ApiOperation("删除系统图")
    @GetMapping("/deleteDiagram")
    public CommonResult<Boolean> deleteDiagram(String diagramId) {
        return ResultHelper.single(dataStrategy.deleteDiagram(diagramId));
    }

    /**
     * 根据系统图id获取系统图信息
     *
     * @param diagramId 系统图id
     * @return 系统图对象信息
     */
    @ApiOperation("根据系统图id获取系统图信息")
    @GetMapping("/getDiagram")
    public CommonResult<Diagram> getDiagram(String diagramId) {
        return ResultHelper.single(dataStrategy.getDiagram(diagramId));
    }

    /**
     * 系统实例查询
     *
     * @return 系统实例
     */
    @ApiOperation("系统实例查询")
    @PostMapping("/system/instance")
    public CommonResult<List<ObjectNode>> loadSystemInstance() {
        BdtpRequest current = BdtpRequest.getCurrent();
        String groupCode = current.getGroupCode();
        String projectId = current.getProjectId();
        return ResultHelper.multi(dataStrategy.loadSystemInstance(projectId, groupCode));
    }

    /**
     * 项目下的专业 -> 系统 ->系统实例 的树状结构数据
     *
     * @return 列表
     */
    @ApiOperation("项目下的专业 -> 系统 ->系统实例 的树状结构数据")
    @PostMapping("/major/system/instance")
    public CommonResult<List<ObjectNode>> loadMajorSystemInstance() {
        return ResultHelper.multi(dataStrategy.loadMajorSystemInstance());
    }

    /**
     * 根据系统类获取系统类型下的模板列表  以树状结构数据返回
     *
     * @param diagram diagram.getSystem() 参数
     * @return 列表
     */
    @ApiOperation("据系统类获取系统类型下的模板列表")
    @PostMapping("/systemType/template")
    public CommonResult<List<ObjectNode>> loadSystemTypeTemplate(@RequestBody Diagram diagram) {
        return ResultHelper.multi(dataStrategy.loadSystemTypeTemplate(diagram));
    }

    /**
     * 根据系统图类型获取模板列表
     *
     * @param diagramType 系统图类型
     * @return 模板列表
     */
    @ApiOperation("根据系统图类型获取模板列表")
    @GetMapping("/getTemplates/ByType")
    public CommonResult<List<DiagramTemplate>> getTemplatesByType(String diagramType) {
        return ResultHelper.multi(dataStrategy.getTemplates(diagramType));
    }

    /**
     * 根据模板id获取系统模板信息
     *
     * @param templateId 模板id
     * @return 模板信息
     */
    @ApiOperation("根据模板id获取系统模板信息")
    @GetMapping("/getTemplate/ById")
    public CommonResult<DiagramTemplate> getTemplateById(String templateId) {
        return ResultHelper.single(dataStrategy.getTemplate(templateId));
    }

    /**
     * 获取所有的系统模板
     *
     * @return 模板列表
     */
    @ApiOperation("获取所有的系统模板")
    @GetMapping("/getTemplates")
    public CommonResult<List<DiagramTemplate>> getTemplates() {
        return ResultHelper.multi(dataStrategy.getTemplates());
    }
}
