package cn.timer.api.controller.spmk;


import cn.hutool.core.collection.CollUtil;
import cn.hutool.json.JSONObject;
import cn.timer.api.aspect.lang.annotation.Log;
import cn.timer.api.aspect.lang.enums.BusinessType;
import cn.timer.api.bean.qyzx.QyzxEmpEntAsso;
import cn.timer.api.bean.spmk.SpmkApproveDetailSummary;
import cn.timer.api.bean.spmk.SpmkApproveExecuteRecord;
import cn.timer.api.bean.spmk.SpmkApproveSummary;
import cn.timer.api.bean.spmk.SpmkExecutor;
import cn.timer.api.bean.zzgl.ZzglAuth;
import cn.timer.api.config.annotation.CurrentUser;
import cn.timer.api.config.annotation.UserBean;
import cn.timer.api.config.enuminterface.SpmkEnumInterface.ApproveSummarySts;
import cn.timer.api.config.enuminterface.SpmkEnumInterface.ExecutorSts;
import cn.timer.api.config.enums.CommonEnum;
import cn.timer.api.config.enums.SysRoleType;
import cn.timer.api.dao.qyzx.QyzxEmpEntAssoMapper;
import cn.timer.api.dao.spmk.SpmkApproveExecuteRecordMapper;
import cn.timer.api.dao.spmk.SpmkApproveSummaryMapper;
import cn.timer.api.dao.spmk.SpmkExecutorMapper;
import cn.timer.api.dto.spmk.AdminApprovingDto;
import cn.timer.api.dto.spmk.FlowChildren;
import cn.timer.api.dto.spmk.FromData;
import cn.timer.api.utils.Result;
import cn.timer.api.utils.ResultUtil;
import cn.timer.api.utils.redis.RedisUtil;
import cn.timer.api.utils.router.RouterUtils;
import cn.timer.api.utils.router.business.SpmkAssoBusiness;
import cn.timer.api.utils.router.business.SpmkAssoBusinessFactory;
import cn.timer.api.utils.router.enums.ApproveEnum;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import net.sf.json.JSONArray;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;

@Slf4j
@Api(tags = "3.0Admin审批模块")
@RestController
@Transactional
@RequestMapping(value = "/admin/spmk", produces = { "application/json","multipart/form-data" })
public class AdminSpmkController {


	@Autowired
	private QyzxEmpEntAssoMapper qyzxEmpEntAssoMapper;
	@Autowired
	private SpmkApproveSummaryMapper spmkApproveSummaryMapper;
	@Autowired
	private SpmkExecutorMapper spmkExecutorMapper;

	@Autowired
	private SpmkAssoBusinessFactory spmkAssoBusinessFactory;

	@Autowired
	private SpmkApproveExecuteRecordMapper spmkApproveExecuteRecordMapper;

	private static com.alibaba.fastjson.JSONObject jsonObject = new  com.alibaba.fastjson.JSONObject();

	@Resource
	private RedisUtil redisUtil;

	//TODO 管理员审批
	/**
	 * 管理员审批
	 */
	@PostMapping(value = "/approving")
	@ApiOperation(value = "1.审批人审批", httpMethod = "POST", notes = "审批人审批")
	@Transactional(rollbackFor = Exception.class)
	@ApiOperationSupport(order = 20)
	@Log(title = "审批-审批流程", businessType = BusinessType.UPDATE)
	public Result<Object> approving(@CurrentUser UserBean userBean,@Validated @RequestBody AdminApprovingDto approvingDto) throws Exception {
		/*判断是否有权限转派*/
		//if(approvingDto.getSts()==4){
			QyzxEmpEntAsso ent = QyzxEmpEntAsso.builder().build().selectOne(new QueryWrapper<QyzxEmpEntAsso>().lambda().eq(QyzxEmpEntAsso::getOrgCode, userBean.getOrgCode()).eq(QyzxEmpEntAsso::getEmpNum, userBean.getEmpNum()));
			if(ent != null) {
				/*超管和管理员不受权限控制*/
				if(ent.getUserType() == 2) {
					ZzglAuth zzglAuth = ZzglAuth.builder().build().selectOne(new QueryWrapper<ZzglAuth>().lambda().eq(ZzglAuth::getBmgwId, userBean.getUserInfo().getBmgwId())
							.eq(ZzglAuth::getMenuId, "/Approvalspbutonspbuton020102"));
					if (zzglAuth == null) {
						return ResultUtil.error("您没有权限");
					}
				}
			}
		//}
		Integer asId = approvingDto.getAsId();
		//查询redis中当前有没有在被审批执行中,0是没有在执行,1是在执行
		Integer approStatus=Integer.parseInt(redisUtil.get(asId.toString())==null?"0":redisUtil.get(asId.toString()).toString());
		if(approStatus==1){
			return ResultUtil.error("该审批已在审批中!");
		}else{
			redisUtil.set(asId.toString(),1,2);
		}
		SpmkApproveDetailSummary ad = SpmkApproveDetailSummary.builder().build().selectOne(new QueryWrapper<SpmkApproveDetailSummary>()
				.lambda()
				.select(SpmkApproveDetailSummary::getId,
						SpmkApproveDetailSummary::getRequestData,
						SpmkApproveDetailSummary::getFroms,
						SpmkApproveDetailSummary::getFlowChildren)
				.eq(SpmkApproveDetailSummary::getApproveSummaryId, asId));

		// 查询 SpmkApproveSummary 状态,
		SpmkApproveSummary aSummary = spmkApproveSummaryMapper.selectOne(new QueryWrapper<SpmkApproveSummary>().lambda()
				.select(SpmkApproveSummary::getSts)
				.eq(SpmkApproveSummary::getId, asId));

//		if (aSummary.getSts() > ApproveSummarySts.IN.ordinal()) {
//			redisUtil.set(asId.toString(),0,500);
//			return ResultUtil.error("该审批已结束!");
//		}
//
//		// 查询该 审批的状态 是否为 1 审批中
//		Integer count = SpmkExecutor.builder().build().selectCount(new QueryWrapper<SpmkExecutor>().lambda()
//				.eq(SpmkExecutor::getId, approvingDto.getExecutorId())
//				.eq(SpmkExecutor::getSts, ExecutorSts.IN_EXECUTION.ordinal()));
//
//		if (count == 0) {
//			redisUtil.set(asId.toString(),0,500);
//			return ResultUtil.error("您已审批过!");
//		}

		if ( spmkExecutorMapper.selectCount(new QueryWrapper<SpmkExecutor>().lambda()
				.eq(SpmkExecutor::getId, approvingDto.getExecutorId())
				.eq(SpmkExecutor::getEmpNum, userBean.getEmpNum())
				.eq(SpmkExecutor::getSts, ExecutorSts.IN_EXECUTION.ordinal())) == 0) {

			Integer adminNum = new LambdaQueryChainWrapper<QyzxEmpEntAsso>(qyzxEmpEntAssoMapper)
					.eq(QyzxEmpEntAsso::getEmpNum, userBean.getEmpNum())
					.eq(QyzxEmpEntAsso::getOrgCode, userBean.getOrgCode())
					.in(QyzxEmpEntAsso::getUserType, SysRoleType.U_TYPE_ADMIN,SysRoleType.U_TYPE_C_ADMIN)
					.count();

			if (adminNum <= 0) {
				redisUtil.set(asId.toString(),0,500);
				return ResultUtil.error("非当前审批人 或 管理员,无法操作!");
			}

		}
		//如果是再次审批
		SpmkApproveExecuteRecord spmkApproveExecuteRecord = SpmkApproveExecuteRecord.builder().id(approvingDto.getExecuteRecordId()).build().selectById();
		if(spmkApproveExecuteRecord.getSts()>1){
			spmkApproveExecuteRecordMapper.delExecuteRecord(approvingDto.getExecuteRecordId(), asId);
		}

		List<FlowChildren> listFlowChildren = jsonObject.parseArray(ad.getFlowChildren(),FlowChildren.class);
		RouterUtils.updateRefuseToAgree(
				listFlowChildren,
				asId,
				approvingDto.getExecuteRecordId(),
				approvingDto.getExecutorId(),
				approvingDto.getOpinion(),
				approvingDto.getSts(),
				aSummary.getSts(),
				approvingDto.getUser(),
				approvingDto.getSignatureImg(),
				userBean.getEmpNum(),
				approvingDto.getUserList(),
				approvingDto.getTypeIndex(),
				approvingDto.getUserIndex()
		);


			// 更新 flowChildren
			SpmkApproveDetailSummary sadsUpdate = SpmkApproveDetailSummary.builder().id(ad.getId()).flowChildren(JSONArray.fromObject(listFlowChildren).toString()).build();
			/*// 审批详情 审批时添加 附件
			if(RequestDataUtils.addFileList(ad,approvingDto.getFileList())){
				sadsUpdate.setRequestData(ad.getRequestData());
			}*/
			sadsUpdate.updateById();




			//最后一条数据
			FlowChildren fc = CollUtil.getLast(listFlowChildren);
			if (fc.getExecute() == "2") {
				// 查询 SpmkApproveSummary 状态
				aSummary = spmkApproveSummaryMapper.selectOne(new QueryWrapper<SpmkApproveSummary>().lambda()
						.select(SpmkApproveSummary::getSts,SpmkApproveSummary::getAssoType)
						.eq(SpmkApproveSummary::getId, asId));

//				if (aSummary.getSts() != ApproveSummarySts.REFUSE.ordinal()) {
					SpmkApproveSummary.builder().id(asId).currentApprover(CommonEnum.NULL_STR.getDesc()).endTime(new Date()).sts(ApproveSummarySts.FINISH.ordinal()).build().updateById();

					JSONObject jSONObject = jsonObject.parseObject(ad.getRequestData(),JSONObject.class);
					jSONObject.set("approveId", FromData.builder().value(String.valueOf(asId)).build());
					jSONObject.set("orgCode", userBean.getOrgCode());

					//审批完成后 业务
					SpmkAssoBusiness sab = spmkAssoBusinessFactory.createSpmkService(ApproveEnum.getEnums(aSummary.getAssoType()));
					if (sab != null){

						log.info("1----------{}",sab);
					}
					log.info("2----------{}", jSONObject);
					sab.handleApprove(jSONObject);
				}
//			}

//		}else {
//			redisUtil.set(asId.toString(),0,500);
//			return ResultUtil.error("该审批已结束!");
//		}
		redisUtil.set(asId.toString(),0,500);
		return ResultUtil.success();
	}
	/**
	 * 删除-考核模板

	@DeleteMapping(value = "/del_appraisal_t/{id}")
	@ApiOperation(value = "2.移除-审批人", httpMethod = "DELETE", notes = "移除-审批人")
	@ApiOperationSupport(order = 6)
	@Role
	public Result<Object> delAT(@CurrentUser UserBean userBean,@Validated @RequestBody AdminApprovingDto approvingDto) throws Exception {

		jxglAppraisalTMapper.delete(new QueryWrapper<JxglAppraisalT>().lambda().eq(JxglAppraisalT::getId, id)
				.eq(JxglAppraisalT::getOrgCode, userBean.getOrgCode()));

		return ResultUtil.success();

	}*/

}