package com.mortals.xhx.busiz;


import cn.hutool.core.codec.Base64;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.mortals.framework.annotation.UnAuth;
import com.mortals.framework.common.Rest;
import com.mortals.framework.service.ICacheService;
import com.mortals.framework.utils.ServletUtils;
import com.mortals.xhx.base.system.idgenerator.service.IdgeneratorService;
import com.mortals.xhx.base.system.upload.service.UploadService;
import com.mortals.xhx.base.system.user.model.UserEntity;
import com.mortals.xhx.base.system.user.model.UserQuery;
import com.mortals.xhx.base.system.user.service.UserService;
import com.mortals.xhx.busiz.h5.rsp.ApiResp;
import com.mortals.xhx.common.code.ApiRespCodeEnum;
import com.mortals.xhx.common.code.YesNoEnum;
import com.mortals.xhx.module.dept.model.DeptEntity;
import com.mortals.xhx.module.dept.model.DeptQuery;
import com.mortals.xhx.module.dept.service.DeptService;
import com.mortals.xhx.module.hik.face.model.req.img.ImgReq;
import com.mortals.xhx.module.hik.face.service.IHikFaceService;
import com.mortals.xhx.module.perform.service.PerformPerposeStaffService;
import com.mortals.xhx.module.staff.model.StaffEntity;
import com.mortals.xhx.module.staff.model.StaffQuery;
import com.mortals.xhx.module.staff.service.StaffService;
import com.mortals.xhx.module.workman.model.WorkmanEntity;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;


/**
 * 设备
 *
 * @author: zxfei
 * @date: 2021/8/24 20:28
 */
@RestController
@Slf4j
@RequestMapping("/test")
public class TestController {

    @Autowired
    private IdgeneratorService idgeneratorService;

    @Autowired
    private ICacheService cacheService;
    @Autowired
    private StaffService staffService;
    @Autowired
    private UserService userService;
    @Autowired
    private IHikFaceService faceService;
    @Autowired
    private UploadService uploadService;
    @Autowired
    private DeptService deptService;

    @Autowired
    private PerformPerposeStaffService performPerposeStaffService;

    /**
     * 同步指定日期的海康数据
     *
     * @param req
     * @return
     */
    @PostMapping("hik")
    public String register(@RequestBody BaseReq req) {
        log.info("【测试消息】【请求体】-->  " + JSONObject.toJSONString(req));


        return "ok";
    }


    @GetMapping("updateDeptNum")
    @UnAuth
    public String updateDeptNum() {
        log.info("更新部门用户数量");
        Map<Long, Long> collect = staffService.find(new StaffQuery()).stream().collect(Collectors.groupingBy(x -> x.getDeptId(), Collectors.counting()));

        DeptEntity deptEntity1 = new DeptEntity();
        deptEntity1.setPersonNum(0);
        deptService.getDao().update(deptEntity1,new HashMap<>());

        collect.entrySet().stream().forEach(item -> {
            Long deptId = item.getKey();
            Long count = item.getValue();
            log.info("deptId:{},num:{}", deptId, count);
            DeptEntity deptEntity = deptService.get(deptId);
            if (!ObjectUtils.isEmpty(deptEntity)) {
                deptEntity.setPersonNum(count.intValue());
                deptService.update(deptEntity);
            }

        });


        for (Map.Entry<Long, Long> item : collect.entrySet()) {

            Long deptId = item.getKey();
            DeptEntity deptEntity = deptService.get(deptId);

            if (!ObjectUtils.isEmpty(deptEntity) && !ObjectUtils.isEmpty(deptEntity.getParentId())) {
                int sum = deptService.find(new DeptQuery().parentId(deptEntity.getId())).stream().mapToInt(i -> i.getPersonNum()).sum();
                DeptEntity parentDept = deptService.get(deptEntity.getParentId());
                log.info("dept:{},sum:{}", parentDept.getDeptName(), sum);

                if (ObjectUtils.isEmpty(parentDept)) {
                    parentDept.setPersonNum(sum);
                    deptService.update(parentDept);
                    // updateDeptPersonNum(parentDept);
                }
            }


        }

/*
        //更新父部门的人数归集
        collect.entrySet().stream().forEach(item -> {
            Long deptId = item.getKey();
            DeptEntity deptEntity = deptService.get(deptId);

            if (!ObjectUtils.isEmpty(deptEntity) && !ObjectUtils.isEmpty(deptEntity.getParentId())) {
                int sum = deptService.find(new DeptQuery().parentId(deptEntity.getId())).stream().mapToInt(i -> i.getPersonNum()).sum();
                DeptEntity parentDept = deptService.get(deptEntity.getParentId());
                if (ObjectUtils.isEmpty(parentDept)) {
                    parentDept.setPersonNum(sum);
                    deptService.update(parentDept);
                    updateDeptPersonNum(parentDept);
                }
            }


            // updateDeptPersonNum(deptEntity);

        });*/
        return "ok";
    }


    public static void calculateParentValue(DeptEntity root) {
        if (root == null) {
            return;
        }

        // 递归处理叶子节点
        if (root.getChildren().isEmpty()) {
            return;
        }

        // 递归计算所有子节点的值之和
        int sum = 0;
        for (DeptEntity child : root.getChildren()) {
            calculateParentValue(child);
            sum += child.getPersonNum();
        }

        // 更新当前节点的值为所有子节点值之和
        root.setPersonNum(sum);
    }

    private void updateDeptPersonNum(DeptEntity deptEntity) {
        if (!ObjectUtils.isEmpty(deptEntity) && !ObjectUtils.isEmpty(deptEntity.getParentId())) {
            int sum = deptService.find(new DeptQuery().parentId(deptEntity.getId())).stream().mapToInt(i -> i.getPersonNum()).sum();
            DeptEntity parentDept = deptService.get(deptEntity.getParentId());
            if (ObjectUtils.isEmpty(parentDept)) {
                parentDept.setPersonNum(sum);
                deptService.update(parentDept);
                updateDeptPersonNum(parentDept);
            }
        }
    }

    //
    @GetMapping("updatePersons")
    @UnAuth
    public String updatePersons() {
        log.info("更新用户手机号码");

        cacheService.select(1);
        Map<String, String> map = cacheService.hgetAll("com:mortals:xhx:module:workman:model:WorkmanEntity");
        cacheService.select(14);
        Map<String, WorkmanEntity> userMap = new HashMap<>();

        map.entrySet().stream().forEach(item -> {
            String value = item.getValue();
            WorkmanEntity workmanEntity = JSONObject.parseObject(value, WorkmanEntity.class);
            userMap.put(workmanEntity.getName(), workmanEntity);
        });

        List<StaffEntity> staffEntities = staffService.find(new StaffQuery());
        ArrayList<StaffEntity> updateList = new ArrayList<>();

        for (StaffEntity staffEntity : staffEntities) {
            if (ObjectUtils.isEmpty(staffEntity.getPhoneNumber())) {
                WorkmanEntity workmanEntity = userMap.get(staffEntity.getName());
                if (!ObjectUtils.isEmpty(workmanEntity)) {
                    staffEntity.setPhoneNumber(workmanEntity.getMobile());
                    updateList.add(staffEntity);
                }
            }
        }
        if (!ObjectUtils.isEmpty(updateList)) {
            log.info("更新数量：" + updateList.size());
            for (StaffEntity staffEntity : updateList) {
                staffService.update(staffEntity);
                //更新绑定的系统用户手机号码
                UserQuery userQuery = new UserQuery();
                userQuery.setCustomerId(staffEntity.getId());
                UserEntity userEntity = userService.selectOne(userQuery);
                if (userEntity != null) {
                    Map<String, Object> condition = new HashMap<>(1);
                    condition.put("id", userEntity.getId());
                    Map<String, Object> data = new HashMap<>(1);
                    data.put("mobile", staffEntity.getPhoneNumber());
                    userService.getUserDao().update(data, condition);
                }
            }
        }

        return "更新数量：" + updateList.size();
    }


    @GetMapping("downPersonsPic")
    @UnAuth
    public String downPersonsPic() {
        List<StaffEntity> staffEntities = staffService.find(new StaffQuery());
        ArrayList<StaffEntity> updateList = new ArrayList<>();
        for (StaffEntity staffEntity : staffEntities) {
            if (!ObjectUtils.isEmpty(staffEntity.getPicUri())) {
                ImgReq imgReq = new ImgReq();
                imgReq.setUrl(staffEntity.getPicUri());
                imgReq.setServerIndexCode(staffEntity.getServerIndexCode());
                //Rest<String> rest = faceService.downloadPicture(imgReq);
                try {
                    InputStream in = faceService.callPostImgs(imgReq);
                    if (!ObjectUtils.isEmpty(in)) {
                        MultipartFile file = ServletUtils.getMultipartFile(in, "snap.jpg");
                        String filePath = uploadService.saveFileUpload(file, "file/fileupload/snap/" + DateUtil.today(), null);
                        staffEntity.setPhotoPath(filePath);
                        updateList.add(staffEntity);
                    }
                } catch (Exception e) {
                    log.error("下载出错");
                }
/*
                if (YesNoEnum.YES.getValue() == rest.getCode()) {
                    byte[] bytes = Base64.decode(rest.getData());
                    if (!org.springframework.util.ObjectUtils.isEmpty(bytes)) {
                        InputStream inputStream = new ByteArrayInputStream(bytes);
                        MultipartFile file = ServletUtils.getMultipartFile(inputStream, "snap.jpg");
                        String filePath = uploadService.saveFileUpload(file, "file/fileupload/snap/" + DateUtil.today(), null);
                        staffEntity.setPhotoPath(filePath);

                        updateList.add(staffEntity);
                    }
                } else {
                    log.info("download:{}", JSON.toJSONString(rest));
                }*/
            }
        }
        if (!ObjectUtils.isEmpty(updateList)) {
            staffService.update(updateList);
        }


        return "更新数量：" + updateList.size();
    }


    @GetMapping("downPersonPic")
    @UnAuth
    public String downPersonPic() {
        List<StaffEntity> staffEntities = staffService.find(new StaffQuery());
        StaffEntity staffEntity = staffEntities.get(0);
        if (!ObjectUtils.isEmpty(staffEntity.getPicUri())) {
            ImgReq imgReq = new ImgReq();
            imgReq.setUrl(staffEntity.getPicUri());
            imgReq.setServerIndexCode(staffEntity.getServerIndexCode());
            log.info("req:{}", JSON.toJSONString(imgReq));
            //Rest<String> rest = faceService.downloadPicture(imgReq);
            try {
                InputStream in = faceService.callPostImgs(imgReq);
                if (!ObjectUtils.isEmpty(in)) {
                    MultipartFile file = ServletUtils.getMultipartFile(in, "snap.jpg");
                    String filePath = uploadService.saveFileUpload(file, "file/fileupload/snap/" + DateUtil.today(), null);
                    staffEntity.setPhotoPath(filePath);
                    return filePath;
                } else {
                    return "InputStream is null";
                }
            } catch (Exception e) {
                log.error("下载出错");
            }
        }
        return "null";
    }


    /**
     * 生成模拟数据
     * mortals_xhx_perform_perpose_staff_stat
     *
     * @return
     */
    @GetMapping("randomStatPerposeStaffData")
    @UnAuth
    public Rest<Void> randomStatPerposeStaffData() {


        return Rest.ok();
    }


    public static void main(String[] args) {

    }


}
