package com.face.attachment.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
import com.face.attachment.entity.FaceInfo;
import com.face.attachment.mapper.FaceInfoMapper;
import com.face.attachment.service.IFaceInfoService;
import com.face.attachment.vo.*;
import com.face.global.mapper.GlobalBaseMapper;
import com.face.global.service.impl.GlobalBaseService;
import com.face.global.vo.PageResponseVO;
import com.face.jsonBean.QiuTestRoot;
import com.face.util.DataCopy;
import com.face.util.SystemExceptionUtils;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.tencentcloudapi.common.AbstractModel;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.facefusion.v20220927.FacefusionClient;
import com.tencentcloudapi.facefusion.v20220927.models.DescribeMaterialListRequest;
import com.tencentcloudapi.facefusion.v20220927.models.DescribeMaterialListResponse;
import lombok.extern.slf4j.Slf4j;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import java.util.*;

/**
* <p>
    * 人脸融合基础表 服务类
    * </p>
*
* @author admin
* @since 2025-03-15
*/
@Service
@Slf4j
public class FaceInfoServiceImpl extends GlobalBaseService<FaceInfo, String> implements IFaceInfoService {

    @Autowired
    private FaceInfoMapper faceInfoMapper;

    public FaceInfoServiceImpl(GlobalBaseMapper<FaceInfo, String> globalBaseMapper, IdentifierGenerator identifierGenerator) {
        super(globalBaseMapper, identifierGenerator);
    }



    @Transactional
    @Override
    public FaceInfo updateFaceInfo(FaceInfoModRequestVO modRequestVO) throws Exception {
        FaceInfo faceInfo = this.getById(modRequestVO.getFaceId());
        if (faceInfo == null) {
            throw SystemExceptionUtils.buildBusinessException("dataNotExists");
        }
        DataCopy.copyExistsField(modRequestVO, faceInfo);
        this.updateById(faceInfo);
        return faceInfo;
    }

    @Override
    public FaceInfo updateImgFaceInfo(MultipartFile file, String faceId) throws Exception {
        FaceInfo faceInfo = this.getById(faceId);


        byte[] imageBytes = file.getBytes();


        String imgBase = Base64.getEncoder().encodeToString(imageBytes);
        faceInfo.setFaceBase(imageBytes);

        faceInfoMapper.updateById(faceInfo);

        return faceInfo;
    }

    @Override
    public FaceInfoDetailResponseVO getFaceInfo(String id)  throws Exception {
        FaceInfo faceInfo = this.getById(id);
        if (faceInfo == null) {
            throw SystemExceptionUtils.buildBusinessException("dataNotExists");
        }
        return DataCopy.deepCopyData(faceInfo, FaceInfoDetailResponseVO.class);
    }

    @Override
    public PageResponseVO<FaceInfoPageResponseVO> pageAll(FaceInfoPageRequestVO pageRequestVO) throws Exception {
        PageResponseVO<FaceInfoPageResponseVO> pageResponseVO = new PageResponseVO<>();
        List<FaceInfoPageResponseVO> pageData = this.faceInfoMapper.pageAll(pageRequestVO);
        pageResponseVO.setData(pageData);
        pageResponseVO.setTotalSize(Optional.ofNullable(this.faceInfoMapper.pageCountAll(pageRequestVO)).orElse(0L));
        return pageResponseVO;
    }

    @Override
    public List<FaceInfo> addAllFaceInfoByTx(FaceInfoTxRequestVO requestVO) {
        List<FaceInfo> list=new ArrayList<>();
        try{

            //  SecretId:AKIDufDXigQwFWgdNuCG7kCRTHsFPN8fy3yg
            //  SecretKey:kGZheSFrHVWKvHPJ0TikZAXjicJm490d


            // 实例化一个认证对象，入参需要传入腾讯云账户 SecretId 和 SecretKey，此处还需注意密钥对的保密
            // 代码泄露可能会导致 SecretId 和 SecretKey 泄露，并威胁账号下所有资源的安全性。以下代码示例仅供参考，建议采用更安全的方式来使用密钥，请参见：https://cloud.tencent.com/document/product/1278/85305
            // 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取
            Credential cred = new Credential("AKIDdGj28B1jKl03tY2YxEJH6jGe8VgvzpbA", "PaXHn6B50pgWEoPr7EXxCIDvTr6AGFA4");
            // 实例化一个http选项，可选的，没有特殊需求可以跳过
            HttpProfile httpProfile = new HttpProfile();
            httpProfile.setEndpoint("facefusion.tencentcloudapi.com");
            // 实例化一个client选项，可选的，没有特殊需求可以跳过
            ClientProfile clientProfile = new ClientProfile();
            clientProfile.setHttpProfile(httpProfile);
            // 实例化要请求产品的client对象,clientProfile是可选的
            FacefusionClient client = new FacefusionClient(cred, "ap-chengdu", clientProfile);
            // 实例化一个请求对象,每个接口都会对应一个request对象
            DescribeMaterialListRequest req = new DescribeMaterialListRequest();
            //必须传这个参数
            //测试API接口 at_1895073745956143104
            //二次API接口 at_1895077148660760576
            req.setActivityId(requestVO.getActivityId());
            // 返回的resp是一个DescribeMaterialListResponse的实例，与请求对象对应
            DescribeMaterialListResponse resp = client.DescribeMaterialList(req);
            // 输出json格式的字符串回包

            String qtest= AbstractModel.toJsonString(resp);
            System.out.println(qtest);

            ObjectMapper mapper = new ObjectMapper();
            try {
                QiuTestRoot person = mapper.readValue(qtest, QiuTestRoot.class);
                person.getMaterialInfos().forEach(r->{
                    r.getMaterialFaceList().forEach(g->{
                        FaceInfo faceInfo=new FaceInfo();
                        faceInfo.setActivityName(requestVO.getActivityName());
                        faceInfo.setActivityId(requestVO.getActivityId());
                        faceInfo.setMaterialId(r.getMaterialId());
                        faceInfo.setMaterialName(r.getMaterialName());
                        faceInfo.setFaceId(g.getFaceId());
                        faceInfo.setHeight(g.getFaceInfo().getHeight());
                        faceInfo.setWidth(g.getFaceInfo().getWidth());
                        faceInfo.setX(g.getFaceInfo().getX());
                        faceInfo.setY(g.getFaceInfo().getY());
                        if(null==this.getById(faceInfo.getFaceId())){
                            this.insert(faceInfo);
                            list.add(faceInfo);
                        }
                    });
                });


                //System.out.println(person.getMaterialInfos().get(0).getMaterialFaceList().get(0).getFaceId()); // 输出: John Doe
            } catch (Exception e) {
                e.printStackTrace();
            }


        } catch (TencentCloudSDKException e) {
            System.out.println(e.toString());
        }

        return  list;
    }

    @Override
    public List<FaceInfoTxRequestVO> queryAllActivity() {
        return faceInfoMapper.queryAllActivity();
    }

    @Override
    public List<FaceInfoDetailResponseVO> queryAllFaceInfo(FaceInfoTxRequestVO requestVO) {
        List<FaceInfo> list=faceInfoMapper.queryAllFaceInfo(requestVO);

        List<FaceInfoDetailResponseVO> faceInfoDetailResponseVOList=DataCopy.deepCopyList(list,FaceInfoDetailResponseVO.class);
        faceInfoDetailResponseVOList.forEach(c->{
            if(c.getFaceBase() !=null ){
                c.setFaceBase64Code(Base64.getEncoder().encodeToString(c.getFaceBase()));
            }
        });

        return faceInfoDetailResponseVOList;
    }
}
