package nccloud.web.hrwa.wagrade.query;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import nccloud.commons.lang.ArrayUtils;

import nc.itf.hr.wa.IWaGradeQueryService;
import nc.itf.hr.wa.IWaGradeService;
import nc.lightapp.pubapp.web.template.ref.util.StringUtils;
import nc.vo.pmpub.common.utils.CollectionUtils;
import nc.vo.pub.BusinessException;
import nc.vo.pub.lang.UFDouble;
import nc.vo.wa.grade.CrtVO;
import nc.vo.wa.grade.WaCriterionVO;
import nc.vo.wa.grade.WaGradeVO;
import nc.vo.wa.grade.WaGradeVerVO;
import nc.vo.wa.item.WaItemVO;
import nccloud.framework.service.ServiceLocator;
import nccloud.web.hrwa.wagrade.action.util.WaGradeCommon;
import nccloud.web.hrwa.wagrade.action.util.WaGradeUtil;

public class WaStaTableHelper {
	/**
	 * 
	 * 2019年6月11日下午5:52:23 msw
	 * @param resultMap
	 * @param prmlvList：薪级名称集合
	 * @param seclvList：薪档名称集合
	 * @param pkWaGrd：薪资标准表主键
	 * @param gradeVo
	 * @throws BusinessException：
	 *
	 */
	public void setStaTable(Map<String, Object> resultMap, List<String> prmlvList, List<String> seclvList,
			String pkWaGrd, WaGradeVO gradeVo) throws BusinessException {
		WaGradeVerVO[] gradeVerVo = ServiceLocator.find(IWaGradeService.class).queryGradeVerByGradePK(pkWaGrd);
		WaItemVO itemvo = WaGradeCommon.getWaItem(gradeVo.getPk_wa_item());
		int decimalPlaces = itemvo.getIflddecimal();
		Map<String, Object> map = new HashMap<String, Object>();
		if (ArrayUtils.isEmpty(gradeVerVo)) {
			map = getWaStaTableData(prmlvList, seclvList, null, decimalPlaces);
			resultMap.put("staTable", map);
			return;
		}
		String pkWaGradever = null;
		for (int i = 0; i < gradeVerVo.length; i++) {
			if (gradeVerVo[i].getEffect_flag().booleanValue()) {
				pkWaGradever = gradeVerVo[i].getPk_wa_gradever();
				break;
			}
		}
		// 薪资标准表，有生效的去生肖的标准表数据，没有生效的，展示的标准表数据为空（平湘琴说如果没有生效的，可以不展示薪资标准表数据）
		pkWaGradever = (pkWaGradever == null) ? gradeVerVo[gradeVerVo.length - 1].getPk_wa_gradever() : pkWaGradever;
		CrtVO[] crtVOs = ServiceLocator.find(IWaGradeQueryService.class).queryCriterionByClassid(pkWaGrd, pkWaGradever,
				WaGradeUtil.isTrue(gradeVo.getIsmultsec()));
		if (ArrayUtils.isEmpty(crtVOs)) {// 为了前端好展示数据，当空表时，返回带精度的0
			map = getWaStaTableData(prmlvList, seclvList, null, decimalPlaces);
			resultMap.put("staTable", map);
			return;
		}
		map = getWaStaTableData(prmlvList, seclvList, crtVOs, decimalPlaces);
		resultMap.put("staTable", map);
	}
	/**
	 * 
	 * 2019年6月12日上午10:29:24 msw
	 * @param prmlvList：薪级名称集合
	 * @param seclvList：薪档名称集合
	 * @param crtVOs：薪资标准表数据
	 * @param decimalPlaces：薪资项目精度
	 * @return
	 * @throws BusinessException：
	 * 与前端约定： 如果薪资标准表既有薪级又有薪档，给前端返回数据时用薪级+薪档作为map主键，要显示的数据作为value
	 * 如果只有薪级，无薪档，则用薪级作为map主键，要显示的数据作为value
	 * 如果只有薪档，无薪级，则用薪档作为map主键，要显示的数据作为value
	 */
	public Map<String, Object> getWaStaTableData(List<String> prmlvList, List<String> seclvList, CrtVO[] crtVOs,
			int decimalPlaces) throws BusinessException {
		Map<String, Object> waStaTableMap = new HashMap<String, Object>();
		if (!CollectionUtils.isEmpty(prmlvList)) {// 有薪级
			for (int k = 0; k < prmlvList.size(); k++) {
				if (!CollectionUtils.isEmpty(seclvList)) {// 有薪档
					setWaStaTableDataWithPrmlvWithSeclv(waStaTableMap, prmlvList.get(k), seclvList, crtVOs,
							decimalPlaces);
				} else {// 有薪级，没薪档
					setWaStaTableDataWithPrmlvWithoutSeclv(waStaTableMap, prmlvList.get(k), null, crtVOs,
							decimalPlaces);
				}
			}
		} else {
			if (!CollectionUtils.isEmpty(seclvList)) {// 没有薪级，有薪档
				setWaStaTableDataWithoutPrmlvWithSeclv(waStaTableMap, null, seclvList, crtVOs, decimalPlaces);
			} else {// 既没有设置薪级，也没有设置薪档（没有设置薪资标准表数据）
				setWaStaTableDataWithoutPrmlvWithoutSeclv(waStaTableMap, null, null, crtVOs, decimalPlaces);
			}
		}
		return waStaTableMap;
	}
	/**
	 * 
	 * 2019年6月12日上午10:29:20 msw
	 * @param waStaTableMap
	 * @param prmlvName：薪级名称
	 * @param seclvList：薪档名称集合
	 * @param crtVOs：薪资标准表数据
	 * @param decimalPlaces：薪资项目精度
	 *
	 */
	private void setWaStaTableDataWithPrmlvWithSeclv(Map<String, Object> waStaTableMap, String prmlvName,
			List<String> seclvList, CrtVO[] crtVOs, int decimalPlaces) {
		for (int j = 0; j < seclvList.size(); j++) {
			if (!ArrayUtils.isEmpty(crtVOs)) {
				setWaStaTableData(crtVOs, waStaTableMap, decimalPlaces, seclvList.get(j), prmlvName);
			} else {// 有薪级，有薪档，但没有设置信息标准表数据
				waStaTableMap.put(prmlvName + seclvList.get(j), getCriterionVo(null, decimalPlaces));
			}
		}
	}
	/**
	 * 
	 * 2019年6月12日上午10:29:15 msw
	 * @param waStaTableMap
	 * @param prmlvName：薪级名称
	 * @param seclvList：薪档名称集合
	 * @param crtVOs：薪资标准表数据
	 * @param decimalPlaces：薪资项目精度
	 *
	 */
	private void setWaStaTableDataWithPrmlvWithoutSeclv(Map<String, Object> waStaTableMap, String prmlvName,
			List<String> seclvList, CrtVO[] crtVOs, int decimalPlaces) {
		if (!ArrayUtils.isEmpty(crtVOs)) {// 有薪资标准表数据
			setWaStaTableData(crtVOs, waStaTableMap, decimalPlaces, null, prmlvName);
		} else {// 有薪级，没薪档，没有设置有薪资标准表数据
			waStaTableMap.put(prmlvName, getCriterionVo(null, decimalPlaces));
		}
	}
	/**
	 * 
	 * 2019年6月12日上午10:29:12 msw
	 * @param waStaTableMap
	 * @param prmlvName：薪级名称
	 * @param seclvList：薪档名称集合
	 * @param crtVOs：薪资标准表数据
	 * @param decimalPlaces：薪资项目精度
	 *
	 */
	private void setWaStaTableDataWithoutPrmlvWithSeclv(Map<String, Object> waStaTableMap, String prmlvName,
			List<String> seclvList, CrtVO[] crtVOs, int decimalPlaces) {
		for (int j = 0; j < seclvList.size(); j++) {
			if (!ArrayUtils.isEmpty(crtVOs)) {// 薪资标准表有数据
				setWaStaTableData(crtVOs, waStaTableMap, decimalPlaces, seclvList.get(j), null);
			} else {// 没有设置薪资标准表数据
				waStaTableMap.put(seclvList.get(j), getCriterionVo(null, decimalPlaces));
			}
		}
	}
	/**
	 * 
	 * 2019年6月12日上午10:29:08 msw
	 * @param waStaTableMap
	 * @param prmlvName：薪级名称
	 * @param seclvList：薪档名称集合
	 * @param crtVOs：薪资标准表数据
	 * @param decimalPlaces：薪资项目精度
	 *
	 */
	private void setWaStaTableDataWithoutPrmlvWithoutSeclv(Map<String, Object> waStaTableMap, String prmlvName,
			List<String> seclvList, CrtVO[] crtVOs, int decimalPlaces) {
		waStaTableMap.put(null, getCriterionVo(null, decimalPlaces));
	}
	/**
	 * 
	 * 2019年6月12日上午10:29:04 msw
	 * @param crtVOs：薪资标准表数据
	 * @param waStaTableMap
	 * @param decimalPlaces：薪资项目精度
	 * @param seclvName：薪档名称集合
	 * @param prmlvName：薪级名称
	 * 与前端约定： 如果薪资标准表既有薪级又有薪档，给前端返回数据时用薪级+薪档作为map主键，要显示的数据作为value
	 * 如果只有薪级，无薪档，则用薪级作为map主键，要显示的数据作为value
	 * 如果只有薪档，无薪级，则用薪档作为map主键，要显示的数据作为value
	 *
	 */
	private void setWaStaTableData(CrtVO[] crtVOs, Map<String, Object> waStaTableMap, int decimalPlaces,
			String seclvName, String prmlvName) {
		for (int i = 0; i < crtVOs.length; i++) {
			List<Object> list = crtVOs[i].getVecData();
			for (int t = 0; t < list.size(); t++) {
				WaCriterionVO vo = (WaCriterionVO) list.get(t);
				// 如果薪资标准表既有薪级又有薪档，给前端返回数据时用薪级+薪档作为map主键，要显示的数据作为value
				if ((!StringUtils.isEmpty(prmlvName) && prmlvName.equals(vo.getPrmlvName()))
						&& (!StringUtils.isEmpty(seclvName) && seclvName.equals(vo.getSeclvName()))) {
					waStaTableMap.put((prmlvName + seclvName), getCriterionVo(vo, decimalPlaces));
					break;
				}
				// 如果只有薪档，无薪级，则用薪档作为map主键，要显示的数据作为value
				if (StringUtils.isEmpty(prmlvName)
						&& (!StringUtils.isEmpty(seclvName) && seclvName.equals(vo.getSeclvName()))) {
					waStaTableMap.put(seclvName, getCriterionVo(vo, decimalPlaces));
					break;
				}
				// 如果只有薪级，无薪档，则用薪级作为map主键，要显示的数据作为value
				if (StringUtils.isEmpty(seclvName)
						&& (!StringUtils.isEmpty(prmlvName) && prmlvName.equals(vo.getPrmlvName()))) {
					waStaTableMap.put(prmlvName, getCriterionVo(vo, decimalPlaces));
					break;
				}
			}
		}
	}
	/**
	 * 
	 * 下午4:26:56 msw
	 * @param vo
	 * @param decimalPlaces：薪资项目精度
	 * @return：
	 *
	 */
	public WaCriterionVO getCriterionVo(WaCriterionVO vo, int decimalPlaces) {
		if (vo == null) {
			vo = new WaCriterionVO();
		}
		// 设置薪资标准表默认值，如果最小、标准、或是最大值中某一个没值，默认设置为0
		setWaStandTableDefaultVal(vo);
		// 通过薪资项目精度，设置薪资标准表最小值、标准值、和最大值
		formatWaStandTableValByDecimalPlaces(vo, decimalPlaces);
		return vo;
	}
	/**
	 * 
	 * 2019年6月25日上午9:47:34 msw
	 * @param vo
	 * @param decimalPlaces：薪资项目精度
	 * 通过薪资项目精度，设置薪资标准表最小值、标准值、和最大值
	 */
	private void formatWaStandTableValByDecimalPlaces(WaCriterionVO vo, int decimalPlaces) {
		vo.setMin_value(WaGradeUtil.formatUFDoubleData(vo.getMin_value(), decimalPlaces));
		vo.setCriterionvalue(WaGradeUtil.formatUFDoubleData(vo.getCriterionvalue(), decimalPlaces));
		vo.setMax_value(WaGradeUtil.formatUFDoubleData(vo.getMax_value(), decimalPlaces));
	}

	/**
	 * 
	 * 2019年6月25日上午9:44:23 msw
	 * @param vo：
	 * 设置薪资标准表默认值，如果最小、标准、或是最大值中某一个没值，默认设置为0
	 */
	private void setWaStandTableDefaultVal(WaCriterionVO vo) {
		if (vo.getMin_value() == null) {
			vo.setMin_value(new UFDouble(0));
		}
		if (vo.getCriterionvalue() == null) {
			vo.setCriterionvalue(new UFDouble(0));
		}
		if (vo.getMax_value() == null) {
			vo.setMax_value(new UFDouble(0));
		}
	}
}
