package cn.hmsoft.frame.service;

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

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

import cn.hmsoft.frame.data.dao.FrameRoleDao;
import cn.hmsoft.frame.data.dao.FrameRoleResDao;
import cn.hmsoft.frame.data.model.FrameOptrRole;
import cn.hmsoft.frame.data.model.FrameRes;
import cn.hmsoft.frame.data.model.FrameRole;
import cn.hmsoft.frame.data.model.FrameRoleRes;
import cn.hmsoft.frame.util.FrameAssertUtil;

/**********************
 * 框架角色服务
 * 
 * @author zxq
 * @create 2019-06-23 15:49:03
 * @version 2.0.0
 * @email: revisit@126.com
 * @Company: www.hmsoft.cn
 */
@Service
public class FrameRoleService extends FrameService {

	@Autowired
	private FrameRoleDao daoRole;
	@Autowired
	private FrameRoleResDao daoRes;

	public void addRole(FrameRole role) {
		FrameAssertUtil.isNotEmpty(role.getRole_name(), "角色名称不允许为空");
		role.setRole_name(role.getRole_name().trim());
		FrameRole tr = this.daoRole.find("role_name", role.getRole_name());
		FrameAssertUtil.isNull(tr, "角色名称 " + role.getRole_name() + " 已经存在，请重新输入");
		this.daoRole.insert(role);
	}

	public void editRole(FrameRole role) {
		FrameAssertUtil.isNotEmpty(role.getRole_name(), "角色名称不允许为空");
		FrameRole tr = this.daoRole.find("role_name", role.getRole_name());
		if (tr != null)
			FrameAssertUtil.isEqual(tr.getRole_id(), role.getRole_id(), "角色名称 " + role.getRole_name() + " 已经存在，请重新输入");
		this.daoRole.update(role);
	}

	public void deleteRole(int role_id) {
		int count = this.daoRole.count(FrameOptrRole.class, "role_id", role_id);
		FrameAssertUtil.moreThen(1, count, "还有操作员属于该角色，不允许删除此角色");
		// 删除角色表
		this.daoRole.delete(role_id);
		// 删除角色资源
		this.daoRes.delete(FrameRoleRes.class, "role_id", role_id);
	}

	/*****************
	 * 给角色分配资源
	 * 
	 * @param role_id
	 * @param res_ids
	 */
	public void grantRole(int role_id, Integer[] res_ids) {
		if (res_ids == null)
			return;
		this.daoRole.delete(FrameRoleRes.class, "role_id", role_id);
		Map<Integer, Integer> map = new HashMap<Integer, Integer>();
		for (Integer id : res_ids) {
			this.checkResPid(id, map);
		}

		for (int res_id : map.keySet()) {
			final FrameRoleRes frr = new FrameRoleRes();
			frr.setRes_id(res_id);
			frr.setRole_id(role_id);
			this.daoRes.insert(frr);
		}
	}

	private FrameRes checkResPid(int res_id, Map<Integer, Integer> map) {
		FrameRes res = this.daoRes.find(FrameRes.class, res_id);
		if (res == null)
			return null;
		if (!map.containsKey(res.getRes_id()))
			map.put(res.getRes_id(), res.getRes_id());
		if (res.getRes_pid() - 0 == 0)
			return null;
		else
			checkResPid(res.getRes_pid(), map);
		return res;
	}
}
