package com.diagbot.web;

import com.diagbot.annotation.SysLogger;
import com.diagbot.client.bean.ResponseData;
import com.diagbot.dto.PushDTO;
import com.diagbot.dto.PushKYJDTO;
import com.diagbot.dto.RespDTO;
import com.diagbot.enums.InputModeEnum;
import com.diagbot.facade.PushFacade;
import com.diagbot.vo.PushKYJVO;
import com.diagbot.vo.PushVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
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 javax.validation.Valid;

/**
 * @Description:推理接口
 * @Author:zhaops
 * @time: 2018/11/20 11:17
 */
@RestController
@RequestMapping("/push")
@Api(value = "推理相关API", tags = { "推理相关API" })
@SuppressWarnings("unchecked")
public class PushController {

    @Autowired
    PushFacade pushFacade;

    @ApiOperation(value = "推理接口(半结构化)[by:zhaops]",
            notes = "age： 年龄(必填)<br>" +
                    "sex：性别(必填)，1：男，2：女<br>" +
                    "symptom：症状,String<br>" +
                    "other：其它史,String<br>" +
                    "vital：查体,String<br>" +
                    "lis：化验,Array<br>" +
                    "lis：name：套餐名称(必填),String<br>" +
                    "lis：detailName：化验项名称(必填),String<br>" +
                    "lis：uniqueName：公表名称,String<br>" +
                    "lis：value：值,Double<br>" +
                    "lis：maxValue：最大值,Double<br>" +
                    "lis：minValue：最小值,Double<br>" +
                    "lis：units：单位,String<br>" +
                    "lis：otherValue：其他结果，包括阴性阳性，文字描述等,String<br>" +
                    "lis：source：数据来源（必填）,Integer<br>" +
                    "pacs：辅检,String<br>" +
                    "diag：诊断,String<br>" +
                    "featureType：类型(必填)，1：症状，3：其他史，4：查体，5：化验，6：辅检，7：诊断，8：治疗方案,String<br>" +
                    "diseaeId：取治疗方案的诊断,Long<br>")
    @PostMapping("/pushInner")
    @SysLogger("pushInner")
    public RespDTO<PushDTO> pushInner(@RequestBody @Valid PushVO pushVO) {
        return RespDTO.onSuc(pushFacade.pushInner(pushVO, InputModeEnum.Structured.getKey()));
    }

    @ApiOperation(value = "推理接口(文本模式)[by:zhaops]",
            notes = "age： 年龄(必填)<br>" +
                    "sex：性别(必填)，1：男，2：女<br>" +
                    "symptom：症状,String<br>" +
                    "other：其它史,String<br>" +
                    "vital：查体,String<br>" +
                    "lis：化验,Array<br>" +
                    "lis：化验,Array<br>" +
                    "lis：name：套餐名称(必填),String<br>" +
                    "lis：detailName：化验项名称(必填),String<br>" +
                    "lis：uniqueName：公表名称,String<br>" +
                    "lis：value：值,Double<br>" +
                    "lis：maxValue：最大值,Double<br>" +
                    "lis：minValue：最小值,Double<br>" +
                    "lis：units：单位,String<br>" +
                    "lis：otherValue：其他结果，包括阴性阳性，文字描述等,String<br>" +
                    "lis：source：数据来源（必填）,Integer<br>" +
                    "pacs：辅检,String<br>" +
                    "diag：诊断,String<br>" +
                    "featureType：类型(必填)，1：症状，3：其他史，4：查体，5：化验，6：辅检，7：诊断，8：治疗方案,String<br>" +
                    "diseaeId：取治疗方案的诊断,Long<br>")
    @PostMapping("/pushText")
    @SysLogger("pushText")
    public RespDTO<PushDTO> pushText(@RequestBody @Valid PushVO pushVO) {
        return RespDTO.onSuc(pushFacade.pushInner(pushVO, InputModeEnum.Text.getKey()));
    }

    @ApiOperation(value = "推理接口（大数据结果）[by:zhaops]",
            notes = "age： 年龄(必填)<br>" +
                    "sex：性别(必填)，1：男，2：女<br>" +
                    "symptom：症状,String<br>" +
                    "other：其它史,String<br>" +
                    "vital：查体<br>" +
                    "lis：化验,Array<br>" +
                    "lis：化验,Array<br>" +
                    "lis：name：套餐名称(必填),String<br>" +
                    "lis：detailName：化验项名称(必填),String<br>" +
                    "lis：uniqueName：公表名称,String<br>" +
                    "lis：value：值,Double<br>" +
                    "lis：maxValue：最大值,Double<br>" +
                    "lis：minValue：最小值,Double<br>" +
                    "lis：units：单位,String<br>" +
                    "lis：otherValue：其他结果，包括阴性阳性，文字描述等,String<br>" +
                    "lis：source：数据来源（必填）,Integer<br>" +
                    "pacs：辅检,String<br>" +
                    "dis：诊断<br>" +
                    "featureType(必填)：类型，1：症状，3：其他史，4：查体，5：化验，6：辅检，7：诊断，8：治疗方案,String<br>")
    @PostMapping("/pushAI")
    @SysLogger("pushAI")
    public RespDTO<ResponseData> pushAI(@RequestBody @Valid PushVO pushVO) {
        return RespDTO.onSuc(pushFacade.pushAI(pushVO));
    }

    @ApiOperation(value = "推理接口(快易检）[by:zhaops]",
            notes = "age： 年龄(必填)<br>" +
                    "sex：性别(必填)，1：男，2：女<br>" +
                    "lisKYJVOList：化验项列表(必填)<br>" +
                    "featureType(必填)：类型，1：症状，3：其他史，4：查体，5：化验，6：辅检，7：诊断，8：治疗方案,String<br>")
    @PostMapping("/pushKYJ")
    @SysLogger("pushKYJ")
    public RespDTO<PushKYJDTO> pushKYJ(@RequestBody @Valid PushKYJVO pushKYJVO) {
        return RespDTO.onSuc(pushFacade.pushKYJ(pushKYJVO));
    }
}