package com.heyu.api.controller.objectdet;


import com.aliyun.objectdet20191230.models.DetectIPCObjectResponse;
import com.aliyun.objectdet20191230.models.DetectIPCObjectResponseBody;
import com.heyu.api.alibaba.handle.objectdet.ADetectIPCObjectHandle;
import com.heyu.api.alibaba.request.objectdet.ADetectIPCObjectRequest;
import com.heyu.api.controller.BaseController;
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.objectdet.DetectIPCObjectReq;
import com.heyu.api.resp.objectdet.DetectIPCObjectResp;
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;

/**
 * IPC 图像目标检测控制器
 * <p>
 * 基于阿里云物体检测 API，专门针对 IPC（网络摄像头）场景进行目标检测。
 * 检测图像中的人、宠物、车辆等目标，返回目标类型和置信度信息。
 * </p>
 * <p>
 * 核心优势：
 * <ul>
 *   <li>场景广泛：适应室内外、昼夜、家居店铺等多种场景</li>
 *   <li>检测范围广：支持大目标和小目标（远距离摄像头）</li>
 *   <li>高效率：高并发处理，响应时间短</li>
 *   <li>IPC 优化：针对监控摄像头画面特点优化</li>
 * </ul>
 * </p>
 * <p>
 * 适用场景：
 * <ul>
 *   <li>智能看家：检测家人、宠物移动，生成活动提醒</li>
 *   <li>智能看店：夜间安防，人员入侵检测</li>
 *   <li>智能看厂：厂区人员监管、在岗检测</li>
 *   <li>安防监控：实时目标识别与告警</li>
 * </ul>
 * </p>
 * <p>
 * 阿里云 API 文档：<a href="https://next.api.aliyun.com/api/objectdet/2019-12-30/DetectIPCObject?tab=DOC">DetectIPCObject</a>
 * </p>
 * <p>
 * 接口路径：/object/ipc
 * </p>
 *
 * @author heyu
 * @since 1.0.0
 */
@Slf4j
@RestController
@RequestMapping("/object")
@NotIntercept
public class DetectIPCObjectController extends BaseController {


    @Autowired
    private ADetectIPCObjectHandle aDetectIPCObjectHandle;


    /**
     * IPC 图像目标检测接口
     * <p>
     * 接收图片（URL 或 Base64），调用阿里云 IPC 目标检测 API，识别图像中的人、宠物、车辆等目标。
     * 返回每个目标的类型（人/车/宠物等）和置信度评分。
     * </p>
     * <p>
     * 检测结果可能包括：
     * <ul>
     *   <li>人（Person）</li>
     *   <li>车辆（Car、Truck 等）</li>
     *   <li>宠物（Cat、Dog 等）</li>
     *   <li>其他可识别目标</li>
     * </ul>
     * </p>
     *
     * @param req 检测请求参数，包含 imageUrl 或 imageBase64（二选一）
     * @return 目标检测结果列表，每个元素包含 type（目标类型）和 score（置信度）
     */
    @RequestMapping("/ipc")
    public R ipc(DetectIPCObjectReq req) {

        List<DetectIPCObjectResp> respList = new ArrayList<>();

        ADetectIPCObjectRequest aDetectIPCObjectRequest = new ADetectIPCObjectRequest();
        aDetectIPCObjectRequest.setImageBase64(req.getImageBase64());
        aDetectIPCObjectRequest.setImageUrl(req.getImageUrl());


        ApiR<DetectIPCObjectResponse> aR = aDetectIPCObjectHandle.handle(aDetectIPCObjectRequest);
        if (aR.isSuccess() && isSuccessStatusCode(aR.getData().getStatusCode())) {
            DetectIPCObjectResponseBody.DetectIPCObjectResponseBodyData responseBodyData = aR.getData().getBody().getData();
            if (CollectionUtils.isNotEmpty(responseBodyData.getElements())) {
                for (DetectIPCObjectResponseBody.DetectIPCObjectResponseBodyDataElements element : responseBodyData.getElements()) {

                    DetectIPCObjectResp resp = new DetectIPCObjectResp();
                    resp.setScore(element.getScore());
                    resp.setType(element.getType());

                    respList.add(resp);
                }

            }
            return R.ok().setData(respList);

        }
        return R.error(aR.getErrorMsg());
    }
}
