/**
 * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
 */
package com.jeeplus.modules.oa.service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import com.google.common.collect.Maps;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.jeeplus.common.persistence.Page;
import com.jeeplus.common.service.CrudService;
import com.jeeplus.common.utils.StringUtils;
import com.jeeplus.modules.oa.entity.OaAttendancePlace;
import com.jeeplus.modules.oa.entity.OaAttendanceRule;
import com.jeeplus.modules.sys.entity.Office;
import com.jeeplus.modules.oa.dao.OaAttendancePlaceDao;
import com.jeeplus.modules.oa.dao.OaAttendanceRuleDao;

/**
 * 考勤规则Service
 * @author 孟祥越
 * @version 2017-05-10
 */
@Service
@Transactional(readOnly = true)
public class OaAttendanceRuleService extends CrudService<OaAttendanceRuleDao, OaAttendanceRule> {

	@Autowired
	private OaAttendancePlaceDao oaAttendancePlaceDao;

    @Autowired
    private OaAttendanceRuleDao oaAttendanceRuleDao;

    public OaAttendanceRule get(String id) {
		OaAttendanceRule oaAttendanceRule = super.get(id);
		if(oaAttendanceRule !=null){
			oaAttendanceRule.setOaAttendancePlaceList(oaAttendancePlaceDao.findList(new OaAttendancePlace(oaAttendanceRule)));
		}
		return oaAttendanceRule;
	}
	
	public List<OaAttendancePlace> getOaAttendancePlaceByRule(String ruleId) {
		OaAttendanceRule oaAttendanceRule = super.get(ruleId);
		List<OaAttendancePlace> oaAttendancePlaceList= oaAttendancePlaceDao.findList(new OaAttendancePlace(oaAttendanceRule));
		return oaAttendancePlaceList;
	}
	
	public OaAttendancePlace getOaAttendancePlace(String placeId) {
		OaAttendancePlace oaAttendancePlace = oaAttendancePlaceDao.get(placeId);
		return oaAttendancePlace;
	}
	
	public List<OaAttendanceRule> findList(OaAttendanceRule oaAttendanceRule) {
		return super.findList(oaAttendanceRule);
	}
	
	public Page<OaAttendanceRule> findPage(Page<OaAttendanceRule> page, OaAttendanceRule oaAttendanceRule) {
		return super.findPage(page, oaAttendanceRule);
	}
	
	@Transactional(readOnly = false)
	public void save(OaAttendanceRule oaAttendanceRule) {
		super.save(oaAttendanceRule);
		for (OaAttendancePlace oaAttendancePlace : oaAttendanceRule.getOaAttendancePlaceList()){
			if (oaAttendancePlace.getId() == null){
				continue;
			}
			if (OaAttendancePlace.DEL_FLAG_NORMAL.equals(oaAttendancePlace.getDelFlag())){
				if (StringUtils.isBlank(oaAttendancePlace.getId())){
					oaAttendancePlace.setOaAttendanceRule(oaAttendanceRule);
					oaAttendancePlace.preInsert();
					oaAttendancePlaceDao.insert(oaAttendancePlace);
				}else{
					oaAttendancePlace.preUpdate();
					oaAttendancePlaceDao.update(oaAttendancePlace);
				}
			}else{
				oaAttendancePlaceDao.delete(oaAttendancePlace);
			}
		}
	}
	
	@Transactional(readOnly = false)
	public void saveOaAttendancePlace(OaAttendancePlace oaAttendancePlace) {
		if (OaAttendancePlace.DEL_FLAG_NORMAL.equals(oaAttendancePlace.getDelFlag())){
			if (StringUtils.isBlank(oaAttendancePlace.getId())){
				oaAttendancePlace.preInsert();
				oaAttendancePlaceDao.insert(oaAttendancePlace);
			}else{
				oaAttendancePlace.preUpdate();
				oaAttendancePlaceDao.update(oaAttendancePlace);
			}
		}else{
			oaAttendancePlaceDao.delete(oaAttendancePlace);
		}
		List<OaAttendancePlace> oaAttendancePlaceList = new ArrayList<OaAttendancePlace>();
		if(oaAttendancePlace.getOaAttendanceRule() !=null){
			oaAttendancePlaceList = this.findAttendancePlaceByCompany(oaAttendancePlace.getCompany().getId());
			oaAttendancePlace.getOaAttendanceRule().setOaAttendancePlaceList(oaAttendancePlaceList);
		}
	}
	
	@Transactional(readOnly = false)
	public void delete(OaAttendanceRule oaAttendanceRule) {
        oaAttendanceRuleDao.deleteByLogic(oaAttendanceRule);
		oaAttendancePlaceDao.deleteByLogic(new OaAttendancePlace(oaAttendanceRule));
		List<OaAttendancePlace> oaAttendancePlaceList= findAttendancePlaceByCompany(oaAttendanceRule.getCompany().getId());
		for (OaAttendancePlace oaAttendancePlace : oaAttendancePlaceList) {
			oaAttendancePlaceDao.deleteByLogic(oaAttendancePlace);
		}		
	}
	
	@Transactional(readOnly = false)
	public void deletePlace(String oaAttendancePlaceId) {
		oaAttendancePlaceDao.delete(new OaAttendancePlace(oaAttendancePlaceId));
	}
	
	public List<OaAttendanceRule> findListByCompany(String companyId) {
		OaAttendanceRule or =new OaAttendanceRule();
		or.setCompany(new Office(companyId));
		return dao.findListByCompany(or);
	}

	public OaAttendanceRule findAttendanceRuleByCompany(String companyId) {
		OaAttendanceRule or =new OaAttendanceRule();
		OaAttendanceRule rule =new OaAttendanceRule();
		or.setCompany(new Office(companyId));
		if(dao.findList(or).size()>0){
			rule = dao.findList(or).get(0);
		}else{
			return null;
		}
		if(rule !=null){
			rule.setOaAttendancePlaceList(oaAttendancePlaceDao.findList(new OaAttendancePlace(rule)));
		}
		return rule;
	}
	public List<OaAttendancePlace> findAttendancePlaceByCompany(String companyId) {
		OaAttendancePlace op =new OaAttendancePlace();
		op.setCompany(new Office(companyId));
		return oaAttendancePlaceDao.findList(op);

	}

	/**
	 *	查询规则
	 * @param ruleId
	 * @param companyId
	 */
	public OaAttendanceRule queryRuleByCompanyIdAndRuleId(String ruleId,String companyId){
		HashMap<Object, Object> map = Maps.newHashMap();
		map.put("ruleId",ruleId);
		map.put("companyId",companyId);
		return oaAttendanceRuleDao.queryRuleByCompanyIdAndRuleId(map);
	}
}