/*
 *    Copyright (c) 2018-2025, lengleng All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the following disclaimer.
 * Redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution.
 * Neither the name of the yifu4cloud.com developer nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 * Author: lengleng (wangiegie@gmail.com)
 */
package com.yifu.cloud.plus.v1.yifu.archives.service.impl;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yifu.cloud.plus.v1.yifu.admin.api.entity.SysArea;
import com.yifu.cloud.plus.v1.yifu.admin.api.entity.SysUser;
import com.yifu.cloud.plus.v1.yifu.admin.api.vo.AllUserNaVo;
import com.yifu.cloud.plus.v1.yifu.admin.api.vo.AreaMap;
import com.yifu.cloud.plus.v1.yifu.admin.api.vo.AreaVo;
import com.yifu.cloud.plus.v1.yifu.admin.api.vo.SysUserListVo;
import com.yifu.cloud.plus.v1.yifu.archives.entity.TCutsomerDataPermisson;
import com.yifu.cloud.plus.v1.yifu.archives.entity.TSettleDomain;
import com.yifu.cloud.plus.v1.yifu.archives.mapper.TCutsomerDataPermissonMapper;
import com.yifu.cloud.plus.v1.yifu.archives.mapper.TSettleDomainMapper;
import com.yifu.cloud.plus.v1.yifu.archives.service.TSettleDomainService;
import com.yifu.cloud.plus.v1.yifu.archives.vo.IdNameNoVo;
import com.yifu.cloud.plus.v1.yifu.archives.vo.ProjectSetInfoVo;
import com.yifu.cloud.plus.v1.yifu.archives.vo.SetInfoVo;
import com.yifu.cloud.plus.v1.yifu.archives.vo.TSettleDomainSelectVo;
import com.yifu.cloud.plus.v1.yifu.common.core.constant.CacheConstants;
import com.yifu.cloud.plus.v1.yifu.common.core.constant.CommonConstants;
import com.yifu.cloud.plus.v1.yifu.common.core.util.Common;
import com.yifu.cloud.plus.v1.yifu.common.core.util.R;
import com.yifu.cloud.plus.v1.yifu.common.core.util.RedisUtil;
import com.yifu.cloud.plus.v1.yifu.common.core.vo.YifuUser;
import com.yifu.cloud.plus.v1.yifu.common.dapr.util.UpmsDaprUtils;
import com.yifu.cloud.plus.v1.yifu.common.mybatis.base.BaseEntity;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 项目表
 *
 * @author hgw
 * @date 2022-06-20 10:02:28
 */
@Service
@RequiredArgsConstructor
public class TSettleDomainServiceImpl extends ServiceImpl<TSettleDomainMapper, TSettleDomain> implements TSettleDomainService {
	@Autowired
	private RedisUtil redisUtil;

	@Autowired
	private UpmsDaprUtils upmsDaprUtils;

	private final TCutsomerDataPermissonMapper permissonMapper;

	@Override
	public IPage<TSettleDomain> getPage(Page<TSettleDomain> page, TSettleDomain tSettleDomain) {
		return baseMapper.getPage(page, tSettleDomain);
	}

	@Override
	public IPage<IdNameNoVo> getUnitPage(Page<IdNameNoVo> page, IdNameNoVo idNameNoVo) {
		return baseMapper.getUnitPage(page, idNameNoVo);
	}

	/**
	 * @Author fxj
	 * @Description 清除项目缓存
	 * @Date 17:08 2022/7/11
	 * @Param
	 * @return
	**/
	@Override
	public void removeSettleCache(YifuUser user, List<String> userIdList) {
		try{
			for(String userId : userIdList){
				redisUtil.remove(CacheConstants.WXHR_SETTLE_DOMAIN_VOS_BY_USERID +"_"+userId);
			}
		} catch (Exception e) {
			log.error("清除缓存错误：",e);
		}
	}

	@Override
	public List<String> getSettleDomainIdsByUserId(String userId) {
		List<String> domainIds = new ArrayList<>();
		String userKey = CacheConstants.WXHR_SETTLE_DOMAIN_VOS_BY_USERID + "_" + userId;
		Object settleDomainVoR = redisUtil.get(userKey);
		if (settleDomainVoR != null) {
			return (List<String>) settleDomainVoR;
		} else {
			List<TCutsomerDataPermisson>  permissonList = permissonMapper.selectAllSettleDomainPermissionByUserId(userId);
			if (Common.isNotNull(permissonList)) {
				domainIds = permissonList.stream().map(TCutsomerDataPermisson::getSettleDomainId).collect(Collectors.toList());
				redisUtil.set(userKey, domainIds);
			}
		}
		return domainIds;
	}

	/**
	 * @param settleDomainSelectVo
	 * @Author: wangan
	 * @Date: 2019/10/18
	 * @Description: dataCheckDepart
	 * @return: com.yifu.cloud.v1.hrms.api.vo.TSettleDomainSelectVo
	 **/
	@Override
	public TSettleDomainSelectVo selectSettleDomainSelectVosById(TSettleDomainSelectVo settleDomainSelectVo) {
		return baseMapper.selectSettleDomainSelectVosById(settleDomainSelectVo.getDepartNo());
	}

	@Override
	public TSettleDomainSelectVo getSettleDomainVoById(String id) {
		return baseMapper.getSettleDomainVoById(id);
	}

	@Override
	public List<TSettleDomainSelectVo> selectAllSettleDomainSelectVos() {
		return baseMapper.selectAllSettleDomainSelectVos();
	}

	@Transactional
	@Override
	public R updateProjectInfo(List<TSettleDomain> list) {
		if (Common.isNotNull(list)) {
			R<AreaMap> areaListR;
			TSettleDomain tSettleDomainInfo;

			areaListR = upmsDaprUtils.getAreaMapR();
			if (null == areaListR
					|| areaListR.getCode() != CommonConstants.SUCCESS
					|| Common.isEmpty(areaListR.getData())) {
				return R.failed("获取区域数据失败！");
			}
			Map<String,String> areaMap = areaListR.getData().getLabelIdMap();
			R<SysUserListVo>  res;
			String errorStr;
			for (TSettleDomain domain:list) {
				// 校验必填项
				errorStr = checkInfo(domain);
				if (Common.isNotNull(errorStr)){
					return R.failed(errorStr);
				}
				// 初始化区域数据
				R<Object> tSettleDomain1 = initAreaInfo(areaMap, domain);
				if (tSettleDomain1 != null){
					return tSettleDomain1;
				}
				tSettleDomainInfo = baseMapper.selectOne(Wrappers.<TSettleDomain>query().lambda()
						.eq(TSettleDomain::getDepartNo,domain.getDepartNo())
						.orderByDesc(BaseEntity::getCreateTime)
						.last(CommonConstants.LAST_ONE_SQL));
				if (Common.isNotNull(tSettleDomainInfo)) {
					domain.setId(tSettleDomainInfo.getId());
				}
				// 处理服务团队数据权限 2022-09-19 fxj
				if (Common.isNotNull(domain.getServiceTeam())){
					res = upmsDaprUtils.getUserIdsByUserNames(domain.getServiceTeam());
					if (Common.isNotNull(res) && Common.isNotNull(res.getData()) && Common.isNotNull(res.getData().getUserList())){
						// 先清理缓存
						this.removeSettleCache(null,res.getData().getUserIds());
						saveForEkp(res.getData().getUserList(), domain);
					}
				}
				domain.setDeleteFlag(CommonConstants.ZERO_STRING);
				if (Common.isNotNull(tSettleDomainInfo)) {
					baseMapper.updateById(domain);
				} else {
					baseMapper.insert(domain);
				}
			}
			return R.ok();
		} else {
			return R.failed(CommonConstants.PARAM_IS_NOT_ERROR);
		}
	}

	private String checkInfo(TSettleDomain domain) {
		if (Common.isEmpty(domain.getMId())){
			return "id 不可为空";
		}
		if (Common.isEmpty(domain.getDepartName())|| Common.isEmpty(domain.getDepartNo())){
			return "项目编码及名称不可为空";
		}
		if (Common.isEmpty(domain.getCustomerName())
				|| Common.isEmpty(domain.getCustomerId())
				|| Common.isEmpty(domain.getCustomerNo())){
			return "客户名称、客户编码、客户ID不可为空";
		}
		if (Common.isEmpty(domain.getBpoFlag())){
			return "是否BPO业务不可为空";
		}
		if (Common.isEmpty(domain.getServerItem())){
			return "服务项目不可为空";
		}
		if (Common.isEmpty(domain.getECity())
				|| Common.isEmpty(domain.getEProvince())){
			return "省市不可为空";
		}
		if ( Common.isEmpty(domain.getCreateType())){
			return "创建类型不可为空";
		}
		if (Common.isEmpty(domain.getBusinessPrimaryType())
				|| Common.isEmpty(domain.getBusinessSecondType())
				|| Common.isEmpty(domain.getBusinessThirdType())){
			return "业务类型、业务类型二级分类、业务类型三级分类不可为空";
		}
		if (Common.isEmpty(domain.getStopFlag())){
			return "服务状态不可为空";
		}
				/*
				我司到款单位名称	条件：当服务项目中有社保或公积金时必填
				封面抬头-薪资	条件：当服务项目中有薪资时必填
				封面抬头-商险	条件：当服务项目中有商险时必填  */
		if (Common.isEmpty(domain.getServerItem())){
			if (domain.getServerItem().indexOf("社保") != CommonConstants.ONE_INT_NEGATE){
				if (Common.isEmpty(domain.getSocialType())){
					return  "社保结算类型不可为空";
				}
				if (Common.isEmpty(domain.getUnitOfOurCompany())){
					return  "我司到款单位不可为空";
				}
			}
			if (domain.getServerItem().indexOf("公积金") != CommonConstants.ONE_INT_NEGATE){
				if (Common.isEmpty(domain.getFundType())){
					return  "公积金结算类型不可为空";
				}
				if (Common.isEmpty(domain.getUnitOfOurCompany())){
					return  "我司到款单位不可为空";
				}
			}
			if (domain.getServerItem().indexOf("商险") != CommonConstants.ONE_INT_NEGATE){
				if (Common.isEmpty(domain.getInsuranceSettleType())){
					return  "商险结算类型不可为空";
				}
				if (Common.isEmpty(domain.getInvoiceTitleInsurance())){
					return  "封面台头-商险不可为空";
				}
			}
		}
		if (Common.isEmpty(domain.getManagementTag()) || Common.isEmpty(domain.getRiskFundTag())){
			return  "'管理费是否收费'及'风险金是否收取'不可为空";
		}
		if (CommonConstants.ZERO_STRING.equals(domain.getManagementTag())
				&& Common.isEmpty(domain.getManageServerItem())){
			return "管理费是否收费为是，管理费服务项目不可为空";
		}
		if (CommonConstants.ZERO_STRING.equals(domain.getRiskFundTag())
				&& Common.isEmpty(domain.getRiskServerItem())){
			return "风险金是否收取为是，风险金服务项目不可为空";
		}
		if (Common.isEmpty(domain.getMrSettleType())){
			return "结算方式(管理费、风险金)不可为空";
		}
		return  null;
	}

	private R<Object> initAreaInfo(Map<String, String> areaMap, TSettleDomain tSettleDomain) {
		String areaId;
		if (Common.isNotNull(areaMap)) {
			if (Common.isNotNull(tSettleDomain.getEProvince())){
				areaId = areaMap.get(tSettleDomain.getEProvince());
				if (Common.isNotNull(areaId)){
					tSettleDomain.setProvince(Integer.parseInt(areaId));
				}else {
					return R.failed("获取区域数据失败:" + tSettleDomain.getEProvince());
				}
			}
			if (Common.isNotNull(tSettleDomain.getECity())){
				areaId = areaMap.get(tSettleDomain.getECity());
				if (Common.isNotNull(areaId)){
					tSettleDomain.setCity(Integer.parseInt(areaId));
				}else {
					return R.failed("获取区域数据失败:" + tSettleDomain.getECity());
				}
			}
			if (Common.isNotNull(tSettleDomain.getETown())){
				areaId = areaMap.get(tSettleDomain.getETown());
				if (Common.isNotNull(areaId)){
					tSettleDomain.setTown(Integer.parseInt(areaId));
				}else {
					return R.failed("获取区域数据失败:" + tSettleDomain.getETown());
				}
			}
		}
		return null;
	}

	@Override
	public SetInfoVo getSetInfoByCodes(List<String> codes) {
		List<ProjectSetInfoVo> voList = baseMapper.getSetInfoByCodes(codes);
		SetInfoVo setMap = new SetInfoVo();
		if (Common.isNotNull(voList)){
			setMap.setProjectSetInfoVoMap(voList.stream().collect(Collectors.toMap(k->k.getDepartNo(),k->k)));
		}
		return setMap;
	}

	/**
	 * @Author fxj
	 * @Description 更新EKP对应MVP 项目权限，已有权限不做删除处理
	 * @Date 17:17 2022/9/19
	 * @Param
	 * @return
	 **/
	public  boolean saveForEkp(List<SysUser> userIds, TSettleDomain domain){
		// 1. 先清除现有的这些人的项目权限
		permissonMapper.delete(Wrappers.<TCutsomerDataPermisson>query().lambda()
				.in(TCutsomerDataPermisson::getUserId,userIds)
				.eq(TCutsomerDataPermisson::getSettleDomainId,domain.getId()));
		// 2.新增新的项目人员权限
		TCutsomerDataPermisson pm;
		if (Common.isNotNull(userIds)) {
			for (SysUser user : userIds){
				pm = new TCutsomerDataPermisson();
				pm.setStatus(CommonConstants.ZERO_STRING);
				pm.setUserId(user.getUserId());
				pm.setUserLoginName(user.getUsername());
				pm.setUserNickName(user.getNickname());
				pm.setUserDeptName(user.getDeptName());
				pm.setCreateTime(LocalDateTime.now());
				pm.setSettleDomainId(domain.getId());
				pm.setSettleDomainName(domain.getDepartName());
				pm.setSettleDomainNo(domain.getDepartNo());
				pm.setCreateBy(CommonConstants.ONE_STRING);
				pm.setCreateName("EKP同步");
				pm.setType(CommonConstants.ZERO_STRING);
				permissonMapper.insert(pm);
			}
		}
		return true;
	}
}
