package com.heyu.api.controller.imageaudit;


import com.aliyun.imageaudit20191230.models.ScanTextResponse;
import com.aliyun.imageaudit20191230.models.ScanTextResponseBody;
import com.heyu.api.alibaba.handle.imageaudit.AScanTextHandle;
import com.heyu.api.alibaba.request.imageaudit.AScanTextRequest;
import com.heyu.api.controller.BaseController;
import com.heyu.api.data.annotation.CacheResult;
import com.heyu.api.data.annotation.NotIntercept;
import com.heyu.api.data.utils.ApiR;
import com.heyu.api.data.utils.R;
import com.heyu.api.request.imageaudit.ScanImageReq;
import com.heyu.api.resp.imageaudit.ScanTextResp;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

/***
 *https://next.api.aliyun.com/api/imageaudit/2019-12-30/ScanText
 *
 * 文本内容安全
 *
 * ScanText
 *
 * 功能描述
 * 文本内容安全结合行为、内容，采用多维度、多模型、多检测手段，识别文本中的敏感信息，规避敏感人物姓名、敏感事件描述、敏感言论等内容风险。
 * 支持检测的场景包括：文字垃圾内容识别、文字广告内容识别、文字敏感内容识别、文字暴恐内容识别、文字辱骂内容识别、文字鉴黄内容识别、文字灌水内容识别、
 * 文字违禁内容识别。 在提交检测任务时，您需要指定 Labels 参数，并且支持组合使用，即可对同一段文字进行多种风险检测。如果接口返回结果为空，
 * 表示未检测到 Labels 中的风险点。
 */
@Slf4j
@RestController
@RequestMapping("/scan")
@NotIntercept
public class ScanTextController extends BaseController {


    @Autowired
    private AScanTextHandle aScanTextHandle;

    @RequestMapping("/text")
    @CacheResult
    public R scan(ScanImageReq req) {
        AScanTextRequest request = new AScanTextRequest();
        request.setContents(req.getContents());
        request.setScenes(req.getScenes());
        List<ScanTextResp> resps = new ArrayList<>();

        ApiR<ScanTextResponse> aR = aScanTextHandle.handle(request);

        if (aR.isSuccess() && isSuccessStatusCode(aR.getData().getStatusCode())) {

            ScanTextResponseBody.ScanTextResponseBodyData responseBodyData = aR.getData().getBody().getData();
            List<ScanTextResponseBody.ScanTextResponseBodyDataElements> responseBodyDataElements = responseBodyData.getElements();

            if (CollectionUtils.isNotEmpty(responseBodyDataElements)) {
                for (ScanTextResponseBody.ScanTextResponseBodyDataElements responseBodyDataElement : responseBodyDataElements) {
                    List<ScanTextResponseBody.ScanTextResponseBodyDataElementsResults> results = responseBodyDataElement.getResults();
                    if (CollectionUtils.isNotEmpty(results)) {
                        for (ScanTextResponseBody.ScanTextResponseBodyDataElementsResults result : results) {
                            ScanTextResp scanTextResp = new ScanTextResp();
                            scanTextResp.setRate(result.getRate());
                            scanTextResp.setSuggestion(result.getSuggestion());
                            scanTextResp.setLabel(result.getLabel());
                            List<ScanTextResp.ElementsResultsDetails> elementsResultsDetails = new ArrayList<>();
                            if (CollectionUtils.isNotEmpty(result.getDetails())) {
                                for (ScanTextResponseBody.ScanTextResponseBodyDataElementsResultsDetails detail : result.getDetails()) {

                                    ScanTextResp.ElementsResultsDetails elementsResultsDetail = new ScanTextResp.ElementsResultsDetails();
                                    elementsResultsDetail.setLabel(detail.getLabel());
                                    List<String> contexts = new ArrayList<>();
                                    if (CollectionUtils.isNotEmpty(detail.getContexts())) {
                                        for (ScanTextResponseBody.ScanTextResponseBodyDataElementsResultsDetailsContexts context : detail.getContexts()) {
                                            contexts.add(context.getContext());
                                        }
                                    }
                                    elementsResultsDetail.setContexts(contexts);
                                    elementsResultsDetails.add(elementsResultsDetail);
                                }
                            }
                            scanTextResp.setDetails(elementsResultsDetails);
                            resps.add(scanTextResp);
                        }
                    }
                }
            }
            return R.ok().setData(resps);
        }
        return R.error();
    }

}
