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

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;


import cn.hutool.json.JSONObject;
import cn.timer.api.bean.spmk.*;
import cn.timer.api.dao.spmk.*;

import cn.timer.api.dto.spmk.FlowChildren;
import cn.timer.api.dto.spmk.Router;
import com.alibaba.fastjson.JSON;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

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

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.Console;
import cn.hutool.core.util.ObjectUtil;
import cn.timer.api.config.annotation.UserBean;
import cn.timer.api.controller.zzgl.service.ZzglBmgwMService;
import cn.timer.api.dto.spmk.SpmkApproveDetailDto;


@Service
public class SpmkServiceImpl implements SpmkService{

	@Autowired
	private ZzglBmgwMService zzglBmgwMService;

	@Autowired
	private SpmkApproveDetailMapper spmkApproveDetailMapper;

	@Autowired
	private SpmkApprovalGMapper spmkApprovalGMapper;

	@Autowired
	private SpmkApproveExecuteRecordMapper spmkApproveExecuteRecordMapper;

	@Autowired
	private SpmkApproveDetailSummaryMapper spmkApproveDetailSummaryMapper;

	@Autowired
	private SpmkApproveDetailDraftsMapper spmkApproveDetailDraftsMapper;

	@Autowired
	private SpmkApproveDraftsMapper spmkApproveDraftsMapper;

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

	/**
	 * 根据orgCode查数据库 审批模板 生成 自定义模板
	 * orgCode 企业id
	 */
	@Override
	public boolean createCustomApproval(Integer orgCode) {
		// TODO Auto-generated method stub
		List<SpmkApprovalTemplateG> listAtg = SpmkApprovalTemplateG.builder().build()
				.selectList(new QueryWrapper<SpmkApprovalTemplateG>().lambda().orderByAsc(SpmkApprovalTemplateG::getId));
		List<SpmkApprovalG> listAG = new ArrayList<SpmkApprovalG>(listAtg.size());
		for (SpmkApprovalTemplateG spmkApprovalTemplateG : listAtg) {
			SpmkApprovalG saG = SpmkApprovalG.builder().build();
			BeanUtil.copyProperties(spmkApprovalTemplateG, saG, "id","update_time");
			saG.setOrgCode(orgCode);
			listAG.add(saG);
		}

		Console.log(listAG);
		SpmkCustomApproval sca = SpmkCustomApproval.builder().build();
		List<SpmkApprovalTemplate> listAt = new ArrayList<SpmkApprovalTemplate>();
		for (int i = 0,n = listAG.size(); i < n; i++) {
			boolean b = listAG.get(i).insert();
			if (b) {
				listAt = SpmkApprovalTemplate.builder().build().selectList(new QueryWrapper<SpmkApprovalTemplate>()
						.lambda()
						.eq(SpmkApprovalTemplate::getApprovalTemplateGId, listAtg.get(i).getId()).eq(SpmkApprovalTemplate::getIsOpen, '1').orderByAsc(SpmkApprovalTemplate::getId));
				for (SpmkApprovalTemplate spmkApprovalTemplate : listAt) {
					BeanUtil.copyProperties(spmkApprovalTemplate, sca, "id","approval_template_g_id","update_time","create_time");
					sca.setOrgCode(orgCode);
					sca.setApprovalGId(listAG.get(i).getId());
					sca.setIsAllvisible(1);

					sca.insert();
				}
			}
		}

		return true;
	}

	/**
	 * 根据审批汇总id 获取 审批详情
	 * @param asId
	 * @param empNum
	 * @return
	 */
	@Override
	public SpmkApproveDetailDto selectApproveDetailByAsId(Integer asId,Integer empNum) {
		// TODO Auto-generated method stub
		//SpmkApproveDetail ad = spmkApproveDetailMapper.selectOne(new QueryWrapper<SpmkApproveDetail>().lambda().eq(SpmkApproveDetail::getApproveSummaryId, asId));
		//审批详情
		SpmkApproveDetailSummary ad = spmkApproveDetailSummaryMapper.selectOne(new QueryWrapper<SpmkApproveDetailSummary>().lambda().eq(SpmkApproveDetailSummary::getApproveSummaryId, asId));
		//审批汇总
		SpmkApproveSummary sum = null;
		if(ad != null) {
			sum = SpmkApproveSummary.builder().build().selectOne(new QueryWrapper<SpmkApproveSummary>().lambda().select(SpmkApproveSummary::getId,SpmkApproveSummary::getEmpNum,SpmkApproveSummary::getSts,SpmkApproveSummary::getCreateTime,SpmkApproveSummary::getDigest)
					.eq(SpmkApproveSummary::getId, ad.getApproveSummaryId()));
		}

		SpmkApproveDetailDto adD = SpmkApproveDetailDto.builder().build();
		if (ad == null) {
			return null;
		}
		//审批操作记录
		List<SpmkApproveExecuteRecord> listAer = spmkApproveExecuteRecordMapper.selectListByAsId(asId);
		BeanUtil.copyProperties(ad, adD, "requestData","froms","router","flowChildren","spmkApproveExecuteRecord");
		if(ad.getRequestData() !=null) {
			adD.setRequestData(jsonObject.parseObject(ad.getRequestData(), JSONObject.class));
		}
		if(ad.getFroms()!=null) {
			adD.setFroms(jsonObject.parseArray(ad.getFroms(), JSONObject.class));
		}
		if(ad.getFlowChildren() !=null) {
			adD.setRouter(jsonObject.parseObject(ad.getRouter(), Router.class));
		}
		if(ad.getFlowChildren()!=null) {
			adD.setFlowChildren(jsonObject.parseArray(ad.getFlowChildren(), FlowChildren.class));
		}
		adD.setApproveExecuteRecord(listAer);
		/*** 标记 执行人 阅读 ***/
		if(!CollectionUtils.isEmpty(listAer)){
			this.updateSpmkExecutorReadStatus(listAer,empNum);
		}
		/*** 标记执行人阅读 结束***/
		if(sum != null) {
			adD.setEmpNum(sum.getEmpNum());
			adD.setSts(sum.getSts());
			adD.setLaunchTime(sum.getCreateTime());
			adD.setDigest(sum.getDigest());
			SpmkExecutor exe= null;

			SpmkApproveExecuteRecord exere = SpmkApproveExecuteRecord.builder().build()
					.selectOne(new QueryWrapper<SpmkApproveExecuteRecord>().lambda().select(SpmkApproveExecuteRecord::getId).eq(SpmkApproveExecuteRecord::getApproveSummaryId , sum.getId())
							.eq(SpmkApproveExecuteRecord::getSts, 1));
			if(exere != null) {
				exe = SpmkExecutor.builder().build().selectOne(new QueryWrapper<SpmkExecutor>().lambda().eq(SpmkExecutor::getApproveExecuteRecordId, exere.getId()).orderByDesc(SpmkExecutor::getId));
			}

			if(exe != null) {
				adD.setExecuteEmpNum(exe.getEmpNum());
				adD.setExecuteSts(exe.getSts());
				adD.setExeid(exe.getId());
				adD.setExereid(exere.getId());
			}
		}

		return adD;
	}

	//草稿箱用
	public SpmkApproveDetailDto selectDraftsDetailByAsId(Integer asId) {
		// TODO Auto-generated method stub
		//SpmkApproveDetail ad = spmkApproveDetailMapper.selectOne(new QueryWrapper<SpmkApproveDetail>().lambda().eq(SpmkApproveDetail::getApproveSummaryId, asId));
		SpmkApproveDetailDrafts ad = spmkApproveDetailDraftsMapper.selectOne(new QueryWrapper<SpmkApproveDetailDrafts>().lambda().eq(SpmkApproveDetailDrafts::getApproveSummaryId, asId));
		SpmkApproveDrafts sum = null;
		if(ad != null) {
			sum = SpmkApproveDrafts.builder().build().selectOne(new QueryWrapper<SpmkApproveDrafts>().lambda().select(SpmkApproveDrafts::getId,SpmkApproveDrafts::getEmpNum,SpmkApproveDrafts::getSts,SpmkApproveDrafts::getCreateTime,SpmkApproveDrafts::getDigest)
					.eq(SpmkApproveDrafts::getId, ad.getApproveSummaryId()));
		}

		SpmkApproveDetailDto adD = SpmkApproveDetailDto.builder().build();
		if (ad == null) {
			return null;
		}
		//审批操作记录
//		List<SpmkApproveExecuteRecord> listAer = spmkApproveExecuteRecordMapper.selectListByAsId(asId);
		BeanUtil.copyProperties(ad, adD, "requestData","froms","router","flowChildren","spmkApproveExecuteRecord");
		if(ad.getRequestData() !=null) {
			adD.setRequestData(jsonObject.parseObject(ad.getRequestData(), JSONObject.class));
		}
		if(ad.getFroms()!=null) {
			adD.setFroms(jsonObject.parseArray(ad.getFroms(), JSONObject.class));
		}
		if(ad.getFlowChildren() !=null) {
			adD.setRouter(jsonObject.parseObject(ad.getRouter(), Router.class));
		}
		if(ad.getFlowChildren()!=null) {
			adD.setFlowChildren(jsonObject.parseArray(ad.getFlowChildren(), FlowChildren.class));
		}
//		adD.setApproveExecuteRecord(listAer);
		if(sum != null) {
			adD.setEmpNum(sum.getEmpNum());
			adD.setSts(sum.getSts());
			adD.setLaunchTime(sum.getCreateTime());
			adD.setDigest(sum.getDigest());
			SpmkExecutor exe= null;

			SpmkApproveExecuteRecord exere = SpmkApproveExecuteRecord.builder().build()
					.selectOne(new QueryWrapper<SpmkApproveExecuteRecord>().lambda().select(SpmkApproveExecuteRecord::getId).eq(SpmkApproveExecuteRecord::getApproveSummaryId , sum.getId())
							.eq(SpmkApproveExecuteRecord::getSts, 1));
			if(exere != null) {
				exe = SpmkExecutor.builder().build().selectOne(new QueryWrapper<SpmkExecutor>().lambda().eq(SpmkExecutor::getApproveExecuteRecordId, exere.getId()).orderByDesc(SpmkExecutor::getId));
			}

			if(exe != null) {
				adD.setExecuteEmpNum(exe.getEmpNum());
				adD.setExecuteSts(exe.getSts());
				adD.setExeid(exe.getId());
				adD.setExereid(exere.getId());
			}
		}

		return adD;
	}


	@Override
	public List<SpmkApprovalG> selectListAg(UserBean userBean) {
		// TODO Auto-generated method stub
		List<Integer> depts = zzglBmgwMService.empNumupGetDepts(userBean.getOrgCode(), userBean.getEmpNum());
		return spmkApprovalGMapper.selectListAgInCa(userBean.getOrgCode(), userBean.getEmpNum(), depts);
	}


	/**
	 * 审核汇总详情数据转换
	 * @param
	 */
	@Override
	public String addApproveDetail() {

		QueryWrapper queryWrapper = new QueryWrapper<SpmkApproveDetail>().select("id,approve_summary_id", "name", "department_name", "request_data", "froms", "router", "flow_children");
		List<SpmkApproveDetail> spmkApproveDetails = spmkApproveDetailMapper.selectList(queryWrapper);
		spmkApproveDetails.forEach(t -> {
			SpmkApproveDetailSummary spmkApproveDetailSummary = new SpmkApproveDetailSummary();
			spmkApproveDetailSummary.setApproveSummaryId(t.getApproveSummaryId());
			spmkApproveDetailSummary.setDepartmentName(t.getDepartmentName());
			spmkApproveDetailSummary.setName(t.getName());
			try {
				Object deserialize2 = ObjectUtil.deserialize(t.getFlowChildren());
				String flowChidren = JSON.toJSONString(deserialize2);
				spmkApproveDetailSummary.setFlowChildren(flowChidren);
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				try {
					Object deserialize1 = ObjectUtil.deserialize(t.getFroms());
					String froms = JSON.toJSONString(deserialize1);
					spmkApproveDetailSummary.setFroms(froms);
				} catch (Exception e) {
					e.printStackTrace();
				} finally {
					try {
						Object deserialize = ObjectUtil.deserialize(t.getRequestData());
						String s = JSON.toJSONString(deserialize);
						spmkApproveDetailSummary.setRequestData(s);
					} catch (Exception e) {
						e.printStackTrace();
					} finally {
						try {
							Router router = ObjectUtil.deserialize(t.getRouter());
							String s = JSON.toJSONString(router);
							spmkApproveDetailSummary.setRouter(s);
						} catch (Exception e) {
							e.printStackTrace();
						} finally {
							spmkApproveDetailSummary.insertOrUpdate();

						}
					}
				}
			}
		});

		return "成功";
	}

	/**
	 * 标记 执行人 阅读
	 * @param listAer
	 * @param empNum
	 */
	private void updateSpmkExecutorReadStatus(List<SpmkApproveExecuteRecord> listAer, Integer empNum){
		for (SpmkApproveExecuteRecord entity:listAer ) {
			if(!CollectionUtils.isEmpty(entity.getSpmkExecutors())){
				for (SpmkExecutor se:entity.getSpmkExecutors()) {
					if(empNum.equals(se.getEmpNum()) && 0 == se.getReadStatus()){
						SpmkExecutor.builder().id(se.getId()).readStatus(1).build().updateById();
					}
				}
			}
		}
	}

}