package com.gic.haoban.manage.web.controller.content;

import com.gic.api.base.commons.Page;
import com.gic.api.base.commons.ServiceResponse;
import com.gic.commons.util.EntityUtil;
import com.gic.commons.webapi.reponse.RestResponse;
import com.gic.content.api.dto.comment.ListCommentDTO;
import com.gic.content.api.dto.comment.ListSonCommentDTO;
import com.gic.content.api.enums.UserTypeEnum;
import com.gic.content.api.qdto.comment.ListMobileCommentQDTO;
import com.gic.content.api.qdto.comment.SaveCommentQDTO;
import com.gic.content.api.service.ContentMaterialCommentApiService;
import com.gic.haoban.manage.api.dto.StaffClerkRelationDTO;
import com.gic.haoban.manage.api.enums.HaobanClerkTypeEnum;
import com.gic.haoban.manage.api.service.StaffClerkRelationApiService;
import com.gic.haoban.manage.web.qo.content.comment.CommentCountQO;
import com.gic.haoban.manage.web.qo.content.comment.CommentInfoVO;
import com.gic.haoban.manage.web.qo.content.comment.SaveCommentQO;
import com.gic.haoban.manage.web.qo.content.comment.SonCommentInfoVO;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
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.Collections;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * 好办-知识库-评论
 * @Author MUSI
 * @Date 2023/9/19 3:16 PM
 * @Description
 * @Version
 **/
@RestController
@RequestMapping(path = "/comment")
public class CommentController {

    @Autowired
    private ContentMaterialCommentApiService contentMaterialCommentApiService;

    @Autowired
    private StaffClerkRelationApiService staffClerkRelationApiService;

    /**
     * 评论总数（包含子评论）
     * @return
     */
    @RequestMapping(path = "/count-comment")
    public RestResponse<Integer> countContentComment(CommentCountQO commentCountQO) {

        ListMobileCommentQDTO mobileCommentQDTO = new ListMobileCommentQDTO();
        mobileCommentQDTO.setEnterpriseId(commentCountQO.getEnterpriseId());
        mobileCommentQDTO.setContentMaterialCommentId(commentCountQO.getContentMaterialId());
        mobileCommentQDTO.setMemberId(commentCountQO.getClerkId());
        mobileCommentQDTO.setMaterialPurpose(3);
        ServiceResponse<Integer> serviceResponse = contentMaterialCommentApiService.countCommentForWechat(mobileCommentQDTO);
        return RestResponse.successResult(serviceResponse.getResult());
    }

    /**
     * 评论列表
     * @param commentCountQO
     * @return
     */
    @RequestMapping(path = "/list-comment")
    public RestResponse<Page<CommentInfoVO>> listCommentInfoVo(CommentCountQO commentCountQO) {
        ListMobileCommentQDTO mobileCommentQDTO = new ListMobileCommentQDTO();
        mobileCommentQDTO.setEnterpriseId(commentCountQO.getEnterpriseId());
        mobileCommentQDTO.setContentMaterialCommentId(commentCountQO.getContentMaterialId());
        mobileCommentQDTO.setMemberId(commentCountQO.getClerkId());
        mobileCommentQDTO.setMaterialPurpose(3);

        ServiceResponse<Page<ListCommentDTO>> serviceResponse = contentMaterialCommentApiService.listComment(mobileCommentQDTO);
        return RestResponse.successResult();
    }

    /**
     * 子评论列表
     * @return
     */
    @RequestMapping(path = "/list-son-comment")
    public RestResponse<Page<SonCommentInfoVO>> listSonComment(CommentCountQO commentCountQO) {
        return RestResponse.successResult();
    }

    /**
     * 添加评论
     * @param saveCommentQO
     * @return
     */
    @RequestMapping(path = "/save-comment")
    public RestResponse<SonCommentInfoVO> saveComment(SaveCommentQO saveCommentQO) {
        SaveCommentQDTO saveCommentQDTO = EntityUtil.changeEntityByJSON(SaveCommentQDTO.class, saveCommentQO);
        saveCommentQDTO.setMemberId(saveCommentQO.getClerkId());
        saveCommentQDTO.setReplyMemberId(saveCommentQO.getReplyClerkId());
        List<String> clerkIds = new ArrayList<>();
        clerkIds.add(saveCommentQO.getClerkId());
        if (StringUtils.isNotBlank(saveCommentQO.getReplyClerkId())) {
            clerkIds.add(saveCommentQO.getReplyClerkId());
        }
        Map<String, StaffClerkRelationDTO> clerkInfoMap = this.getClerkInfoMap(saveCommentQO.getWxEnterpriseId(), clerkIds);
        StaffClerkRelationDTO staffClerkRelationDTO = clerkInfoMap.get(saveCommentQO.getClerkId());
        if (staffClerkRelationDTO != null) {
            saveCommentQDTO.setUserCode(staffClerkRelationDTO.getClerkCode());
            if (HaobanClerkTypeEnum.AREA_MANAGER.getCode().equals(staffClerkRelationDTO.getClerkType())) {
                saveCommentQDTO.setUserType(UserTypeEnum.AREA_MANAGER.value);
            }else {
                saveCommentQDTO.setUserType(UserTypeEnum.CLERK.value);
            }
        }
        staffClerkRelationDTO = clerkInfoMap.get(saveCommentQO.getReplyClerkId());
        if (staffClerkRelationDTO != null) {
            saveCommentQDTO.setReplyUserCode(staffClerkRelationDTO.getClerkCode());
            if (HaobanClerkTypeEnum.AREA_MANAGER.getCode().equals(staffClerkRelationDTO.getClerkType())) {
                saveCommentQDTO.setReplyUserType(UserTypeEnum.AREA_MANAGER.value);
            }else {
                saveCommentQDTO.setReplyUserType(UserTypeEnum.CLERK.value);
            }
        }
        ServiceResponse<ListSonCommentDTO> serviceResponse = contentMaterialCommentApiService.saveComment(saveCommentQDTO);
        SonCommentInfoVO sonCommentInfoVO = EntityUtil.changeEntityByJSON(SonCommentInfoVO.class, serviceResponse.getResult());
        return RestResponse.successResult(sonCommentInfoVO);
    }

    public Map<String, StaffClerkRelationDTO> getClerkInfoMap(String wxEnterpriseId, List<String> clerkIds) {
        List<StaffClerkRelationDTO> staffClerkRelations = staffClerkRelationApiService.listByClerkIdsWxEnterpriseId(clerkIds, wxEnterpriseId);

        if (CollectionUtils.isEmpty(staffClerkRelations)) {
            return Collections.emptyMap();
        }
        return staffClerkRelations
                .stream()
                .collect(Collectors.toMap(StaffClerkRelationDTO::getClerkId, Function.identity(), (v1, v2) -> v1));
    }
}
