package com.face.attachment.controller;


import com.face.attachment.entity.FaceInfo;
import com.face.attachment.service.IFaceInfoService;
import com.face.attachment.service.vo.AttachmentVO;
import com.face.attachment.vo.*;
import com.face.global.controller.ManageBaseController;
import com.face.global.vo.ApiResult;
import com.face.global.vo.PageResponseVO;
import com.face.util.ApiResultBuilder;
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.FuseFaceRequest;
import com.tencentcloudapi.facefusion.v20220927.models.FuseFaceResponse;
import com.tencentcloudapi.facefusion.v20220927.models.MergeInfo;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.math.BigInteger;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Base64;
import java.util.List;

@RestController
@RequestMapping("/face/attachment")
@Slf4j
@Tag(name = "人脸融合基础管理")
public class FaceInfoManagerController extends ManageBaseController {

    @Autowired
    private IFaceInfoService faceInfoService;



  /*  @Operation(summary = "修改人脸融合基础")
    @PutMapping("/updateFaceInfo")
    public ApiResult<Integer> updateFaceInfo(@Valid @RequestBody FaceInfoModRequestVO modRequestVO) throws Exception {
        FaceInfo faceInfo = faceInfoService.updateFaceInfo(modRequestVO);
        return ApiResultBuilder.getCommonBuilder(Integer.class).success(faceInfo != null
                ? BigInteger.ONE.intValue() : BigInteger.ZERO.intValue()).build();
    }*/


/*    @Operation(summary = "修改人模版脸图片")
    @PostMapping("/updateImgFaceInfo")
    public ApiResult<Integer> updateImgFaceInfo(@RequestParam("file") MultipartFile file,
                @RequestParam(required = true, value = "faceId") String faceId) throws Exception {
        FaceInfo faceInfo = faceInfoService.updateImgFaceInfo(file,faceId);
        return ApiResultBuilder.getCommonBuilder(Integer.class).success(faceInfo != null
                ? BigInteger.ONE.intValue() : BigInteger.ZERO.intValue()).build();
    }*/




/*    @Operation(summary = "获取人脸融合基础详情")
    @GetMapping("/getFaceInfo")
    public ApiResult<FaceInfoDetailResponseVO> getFaceInfo(@RequestParam(value = "id") String id) throws Exception {
        FaceInfoDetailResponseVO responseVO = faceInfoService.getFaceInfo(id);
        return ApiResultBuilder.getCommonBuilder(FaceInfoDetailResponseVO.class).success(responseVO).build();
    }*/

/*    @Operation(summary = "分页查询人脸融合基础，包含总数")
    @PostMapping("/pageAllFaceInfo")
    public ApiResult<PageResponseVO<FaceInfoPageResponseVO>> pageAll(@Valid @RequestBody FaceInfoPageRequestVO pageRequestVO) throws Exception {
        PageResponseVO<FaceInfoPageResponseVO> pageResponseVO = this.faceInfoService.pageAll(pageRequestVO);
        return ApiResultBuilder.getPageCommonBuilder(FaceInfoPageResponseVO.class).success(pageResponseVO).build();
    }*/


/*    @Operation(summary = "根据腾讯活动ID和名称获取数据存入数据库")
    @PostMapping("/addAllFaceInfoByTx")
    public ApiResult<List<FaceInfo>> addAllFaceInfoByTx(@Valid @RequestBody FaceInfoTxRequestVO requestVO) throws Exception {
        return ApiResultBuilder.getListBuilder(FaceInfo.class).success(faceInfoService.addAllFaceInfoByTx(requestVO)).build();
    }*/

    @Operation(summary = "获取所有活动")
    @GetMapping("/queryAllActivity")
    public ApiResult<List<FaceInfoTxRequestVO>> queryAllActivity() throws Exception {
        return ApiResultBuilder.getListBuilder(FaceInfoTxRequestVO.class).success(faceInfoService.queryAllActivity()).build();
    }

    @Operation(summary = "获取所有人脸模版")
    @PostMapping("/queryAllFaceInfo")
    public ApiResult<List<FaceInfoDetailResponseVO>> queryAllFaceInfo(@Valid @RequestBody FaceInfoTxRequestVO requestVO) throws Exception {
        return ApiResultBuilder.getListBuilder(FaceInfoDetailResponseVO.class).success(faceInfoService.queryAllFaceInfo(requestVO)).build();
    }

    @Operation(summary = "上传单个文件")
    @PostMapping("/uploadSingleFile")
    public ApiResult<FuseFaceResponse> uploadSingleFile(
            @RequestParam("file") MultipartFile file,
            @RequestParam(required = true, value = "activityId") String activityId,
            @RequestParam(required = true, value = "materialId") String materialId,
            @RequestParam(required = true, value = "faceId") String faceId
    ) throws Exception {

        String imgUrl="";
        FuseFaceResponse resp=null;

        try{
            // 实例化一个认证对象，入参需要传入腾讯云账户 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对象
            FuseFaceRequest req = new FuseFaceRequest();


            //活动ID
            req.setProjectId(activityId);




           // Path imageFile = Paths.get("F:\\体验腾讯人脸融合-素材\\222.jpg");
            byte[] imageBytes = file.getBytes();



/*
            InputStream imageInputStream = new FileInputStream("F:\\体验腾讯人脸融合-素材\\111.jpg");
            byte[] imageBytes = new byte[imageInputStream.available()];
            imageInputStream.read(imageBytes);
            imageInputStream.close();*/

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







            //{"MaterialInfos":[{"MaterialId":"mt_1895077021871144960","MaterialStatus":21,"CreateTime":"2025-02-27 19:42:25","UpdateTime":"2025-02-27 19:42:25","MaterialFaceList":[{"FaceId":"mt_1895077021871144960_1","FaceInfo":{"X":159,"Y":360,"Width":49,"Height":64}}],"MaterialName":"微信图片_20250227194033.png","AuditResult":""},{"MaterialId":"mt_1895077032491122688","MaterialStatus":21,"CreateTime":"2025-02-27 19:42:28","UpdateTime":"2025-02-27 19:42:28","MaterialFaceList":[{"FaceId":"mt_1895077032491122688_1","FaceInfo":{"X":373,"Y":362,"Width":49,"Height":69}}],"MaterialName":"微信图片_20250227194036.png","AuditResult":""},{"MaterialId":"mt_1895077041827643392","MaterialStatus":21,"CreateTime":"2025-02-27 19:42:30","UpdateTime":"2025-02-27 19:42:30","MaterialFaceList":[{"FaceId":"mt_1895077041827643392_1","FaceInfo":{"X":242,"Y":401,"Width":57,"Height":70}}],"MaterialName":"微信图片_20250227194038.png","AuditResult":""}],"Count":3,"RequestId":"3585e437-6a27-4dc9-b59b-11f66ca4382f"}


/*            Activity_Id 活动ID
            Material_Id 素材ID
            Face_Id 人脸模版*/


            //活动里面的素材ID
            req.setModelId(materialId);
            //图片返回方式 base64  url
            req.setRspImgType("url");

            MergeInfo mergeInfo=new MergeInfo();
            mergeInfo.setImage(imgBase);

            //素材人脸和对应FaceID
            mergeInfo.setTemplateFaceID(faceId);


            MergeInfo [] mergeInfos =new MergeInfo[1];
            mergeInfos[0]=mergeInfo;

            req.setMergeInfos(mergeInfos);

            req.setLogoAdd(0L);


            // 返回的resp是一个FuseFaceResponse的实例，与请求对象对应
            resp = client.FuseFace(req);
            // 输出json格式的字符串回包
            System.out.println(AbstractModel.toJsonString(resp));

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

        return ApiResultBuilder.getCommonBuilder(FuseFaceResponse.class).success(resp).build();
    }
}
