package cn.timer.api.controller.yggl.service;

import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.timer.api.bean.yggl.YgglMainEmp;
import cn.timer.api.bean.yggl.YgglMainLzb;
import cn.timer.api.bean.zzgl.ZzglBmgwM;
import cn.timer.api.config.enuminterface.YgEnumInterface;
import cn.timer.api.config.enuminterface.YgEnumInterface.jobStatus;
import cn.timer.api.dao.yggl.YgglMainEmpMapper;
import cn.timer.api.dao.zzgl.ZzglBmgwMMapper;
import cn.timer.api.dto.yggl.LzygQueryDto;
import cn.timer.api.dto.yggl.YgzzDto;
import cn.timer.api.utils.ResultUtil;

@Service
public class YgglServiceImpl implements YgglService {

	@Autowired
	private YgglMainEmpMapper ygglMainEmpMapper;
	
	@Autowired
	private ZzglBmgwMMapper zzglBmgwMMapper;
	
	@Override
	public void applicationResignation(LzygQueryDto lzygQueryDto) {
		// TODO Auto-generated method stub
		
		Integer empNum = lzygQueryDto.getEmpNum();
		Integer orgCode = lzygQueryDto.getOrgCode();

		YgglMainEmp ygglMainEmp = ygglMainEmpMapper.selectOne(new QueryWrapper<YgglMainEmp>().lambda()
				.eq(YgglMainEmp::getEmpNum, empNum)
				.eq(YgglMainEmp::getOrgCode, orgCode));
		
//		if (ygglMainEmp.getJobStatus() == jobStatus.LIZHIZHONG.getType()) {
//			return ResultUtil.success("你已在离职中");
//		}
		
		YgglMainLzb ygglMainLzb = YgglMainLzb.builder().empNum(lzygQueryDto.getEmpNum()).build();
		// 移动员工表数据到离职表
		BeanUtil.copyProperties(ygglMainEmp, ygglMainLzb, "before_leaving_sts");
		ygglMainLzb.insert();

		YgglMainEmp.builder().empNum(lzygQueryDto.getEmpNum()).jobStatus(jobStatus.LIZHIZHONG.getType())
				.beforeLeavingSts(ygglMainEmp.getJobStatus()).build()
				.update(new UpdateWrapper<YgglMainEmp>().lambda()
						.eq(YgglMainEmp::getEmpNum, empNum)
						.eq(YgglMainEmp::getOrgCode, orgCode));
		
		YgglMainLzb.builder()
			.jobStatus(jobStatus.LIZHIZHONG.getType())
			.lzTime(lzygQueryDto.getLzTime())
			.lzyy(lzygQueryDto.getLzyy()).lzbz(lzygQueryDto.getLzbz()).build()
			.update(new UpdateWrapper<YgglMainLzb>().lambda()
					.eq(YgglMainLzb::getEmpNum, empNum)
					.eq(YgglMainLzb::getOrgCode, orgCode));
	}

	@Override
	public void applicationRegularization(YgzzDto ygzzDto) {
		// TODO Auto-generated method stub
		YgglMainEmp.builder()
		.jobStatus(1)
		.zzTime(ygzzDto.getZzTime())
		.sjzzTime(new Date())
		.zzRemark(ygzzDto.getZzRemark())
		.build().update(new UpdateWrapper<YgglMainEmp>().lambda()
				.eq(YgglMainEmp::getEmpNum, ygzzDto.getEmpNum())
				.eq(YgglMainEmp::getOrgCode, ygzzDto.getOrgCode())
				);
	}

	@Override
	public Integer selectLeaderEmpNumById(Integer orgCode, Integer id, Integer leave) {
		// TODO Auto-generated method stub
		YgglMainEmp mainEmp = ygglMainEmpMapper.selectOne(new QueryWrapper<YgglMainEmp>().lambda()
				.select(YgglMainEmp::getBmgwId)
				.eq(YgglMainEmp::getEmpNum, id)
				.eq(YgglMainEmp::getOrgCode, orgCode));
		Integer gWId = mainEmp != null ? mainEmp.getBmgwId() : null;
		
		// 企业所有部门岗位
		List<ZzglBmgwM> listBM = zzglBmgwMMapper.selectList(new QueryWrapper<ZzglBmgwM>().lambda()
				.eq(ZzglBmgwM::getOrgCode, orgCode));
		
		// 岗位
		ZzglBmgwM gW = CollUtil.getFirst(listBM.stream().filter(bM -> bM.getId().equals(gWId)).collect(Collectors.toList()));
		
		// 岗位id
		Integer baseBmgwId = gW != null ? gW.getUpId() : null;
		
		// 部门列表
//		List<ZzglBmgwM> listbM = ListUtil.toList();
		// 指定 主管id
		Integer leaderId = null;
		Integer bmgwLeaderId;
		for (int i = 0,n = leave + 1; i < n; i++) {
			ZzglBmgwM bmgwM = getLeaderEmp(listBM, baseBmgwId);
			bmgwLeaderId = bmgwM != null ? bmgwM.getLeader() : null;
			if (i == n-1) {
//				listbM.add(bmgwM);
				leaderId = bmgwLeaderId;
			}
		}
		
		return leaderId;
	}
	
	public ZzglBmgwM getLeaderEmp(List<ZzglBmgwM> listBM, Integer baseBmgwId) {
		ZzglBmgwM zzglBmgwM =  baseBmgwId != null ? 
				CollUtil.getFirst(listBM.stream()
						.filter(bM -> bM.getId().equals(baseBmgwId)).collect(Collectors.toList()))
				: null;
		
		return zzglBmgwM;
		
	}
	

}