package cn.hmsoft.frame.service;

import java.time.LocalDateTime;
import java.util.List;

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

import cn.hmsoft.frame.constants.FrameStatus;
import cn.hmsoft.frame.data.dao.FrameOptrDao;
import cn.hmsoft.frame.data.model.FrameOptr;
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.exception.BusinessException;
import cn.hmsoft.frame.util.FrameAssertUtil;
import cn.hmsoft.helper.SecureHelper;

@Service
public class FrameOptrService extends FrameService {

	@Autowired
	private FrameOptrDao daoFrameOptr;

	/**********************
	 * 获取操作员所有资源
	 * 
	 * @param optr_id
	 * @return 该操作员所拥有的资源
	 */
	public List<FrameRes> fetchOptrRes(int optr_id) {
		if (optr_id == 0) {
			String sql = "select * from frame_res where res_status=? order by res_pid,res_order,res_id";
			return this.daoFrameOptr.listBySql(FrameRes.class, sql, FrameStatus.Active.toString());
		}
		// 获取操作员所属角色的所有权限
		List<FrameRes> array = this.daoFrameOptr.listRolesRes(optr_id);
		// 获取额外权限
		for (FrameRes res : this.daoFrameOptr.listOptrRes(optr_id)) {
			if (FrameStatus.Active.toString().equals(res.getType_status())) {
				// 如果是增加的权限
				boolean has = false;
				for (FrameRes r : array) {
					if (r.getRes_id() - res.getRes_id() == 0) {
						has = true;
						break;
					}
				}
				if (!has) {
					array.add(res);
				}

			} else {
				// 移除的
				FrameRes current = null;
				for (FrameRes r : array) {
					if (r.getRes_id() - res.getRes_id() == 0) {
						current = r;
					}
				}
				if (current != null) {
					array.remove(current);
				}
			}

		}
		return array;
	}

	public void modifyPasswd(FrameOptr optr, int optrId, String oldLoginPass, String loginPass) {
		FrameAssertUtil.isNotEmpty(loginPass, "操作员登录密码不允许为空");
		// 修改自己的密码，需要验证原密码
		if (optrId == optr.getOptr_id()) {
			FrameAssertUtil.isNotEmpty(oldLoginPass, "旧密码不正确，请重新输入");
			FrameOptr op = this.daoFrameOptr.find(FrameOptr.class, optr.getOptr_id());
			FrameAssertUtil.isNotNull(op, "操作员不存在存在，请重新输入");
			FrameAssertUtil.isEqual(SecureHelper.md5(oldLoginPass), op.getLogin_pass(), "旧密码不正确，请重新输入");
		} else {
			// this.authOptrRole(optr, FrameResId.Optr_Passwd);
		}
		FrameOptr sOptr = new FrameOptr();
		sOptr.setOptr_id(optrId);
		sOptr.setLogin_pass(SecureHelper.md5(loginPass));
		this.daoFrameOptr.update(sOptr);
	}

	public void addOptr(FrameOptr sOptr, FrameOptr optr) {
		FrameAssertUtil.isNotEmpty(sOptr.getLogin_name(), "操作员登录名称不允许为空");
		FrameAssertUtil.isNotEmpty(sOptr.getLogin_pass(), "操作员登录密码不允许为空");
		FrameAssertUtil.isNotEmpty(sOptr.getOptr_name(), "操作员真实姓名不允许为空");
		FrameAssertUtil.isNotNull(sOptr.getOptr_dept(), "操作员所属部门不允许为空");
		FrameOptr op = this.daoFrameOptr.find(FrameOptr.class, "login_name", sOptr.getLogin_name());
		FrameAssertUtil.isNull(op, "登录名称 " + sOptr.getLogin_name() + " 已经存在，请重新输入");
		// 密码加密
		sOptr.setLogin_pass(SecureHelper.md5(sOptr.getLogin_pass()));
		sOptr.setCreate_time(LocalDateTime.now());
		sOptr.setCreate_optr(optr.getOptr_id());

		this.daoFrameOptr.insert(sOptr);
	}

	public void editOptr(FrameOptr sOptr, FrameOptr optr) {
		FrameAssertUtil.isNotEmpty(sOptr.getOptr_name(), "操作员真实姓名不允许为空");
		FrameAssertUtil.isNotNull(sOptr.getOptr_dept(), "操作员所属部门不允许为空");
		// 修改操作员信息时，不允许修改密码
		sOptr.setLogin_pass(null);
		sOptr.setLogin_name(null);
		sOptr.setCreate_optr(null);
		sOptr.setCreate_time(null);
		this.daoFrameOptr.update(sOptr);
	}

	/****************
	 * @todo 记录日志 删除操作员，只有创建人才能删除操作员，一定要做好日志
	 * @param optr_id
	 * @param optr
	 */
	public void deleteOptr(int optr_id, FrameOptr optr) {
		// 判断是超级管理员
		if (optr.getOptr_id() - 0 != 0) {
			FrameOptr sOptr = this.daoFrameOptr.find(optr_id);
			FrameAssertUtil.isNotNull(sOptr, "操作员不存在，请检查！");
			FrameAssertUtil.isEqual(sOptr.getCreate_optr(), optr.getOptr_id(), "越权操作，只有创建该操作员的人员方可进行此操作");
		}

		int count = this.daoFrameOptr.count("create_optr", optr_id);
		FrameAssertUtil.isEqual(count, 0, "该操作员创建了其他操作员，必须先删除该操作员下的所有操作员后方可进行此操作！");
		count = this.daoFrameOptr.count(FrameRole.class, "create_optr", optr_id);
		FrameAssertUtil.isEqual(count, 0, "该操作员创建了角色，必须先删除该操作员下的所有角色后方可进行此操作！");
		// 记录日志
		this.daoFrameOptr.delete(optr_id);

	}

	public void modifyPasswd(int optr_id, String passwd, String opasswd, FrameOptr optr) {
		FrameAssertUtil.isNotEmpty(passwd, "操作员登录密码不允许为空");

		FrameOptr op = this.daoFrameOptr.find(FrameOptr.class, optr_id);
		FrameAssertUtil.isNotNull(op, "操作员不存在存在，请重新输入");
		
		FrameAssertUtil.isNotEqual(SecureHelper.md5(passwd), op.getLogin_pass(), "新密码和旧密码一致，无需修改！");
		// 修改自己的密码，需要验证原密码
		if (optr_id == optr.getOptr_id()) {
			FrameAssertUtil.isNotEmpty(opasswd, "旧密码不正确，请重新输入");
			FrameAssertUtil.isEqual(SecureHelper.md5(opasswd), op.getLogin_pass(), "旧密码不正确，请重新输入");
		} else {
			// 修改他人密码
			if (optr.getOptr_id() != 0) {
				FrameAssertUtil.isEqual(optr.getOptr_id(), op.getCreate_optr(), "只有操作员的创建人才能修改密码！");
			}
		}
		FrameOptr sOptr = new FrameOptr();
		sOptr.setOptr_id(optr_id);
		sOptr.setLogin_pass(SecureHelper.md5(passwd));
		this.daoFrameOptr.update(sOptr);
	}

	/*******************
	 * 分配角色
	 */
	public void distRole(int optr_id, int role_id, FrameOptr optr) {
		FrameOptr op = this.daoFrameOptr.find(optr_id);
		FrameRole role = this.daoFrameOptr.find(FrameRole.class, role_id);
		if (optr.getOptr_id().intValue() != 0) {
			FrameAssertUtil.isEqual(optr.getOptr_id(), op.getCreate_optr(), "只有操作员的创建人才能分配权限！");
			FrameAssertUtil.isEqual(optr.getOptr_id(), role.getCreate_optr(), "只有角色的创建人才能将权限分配出去！");
		}

		try {
			FrameOptrRole or = new FrameOptrRole();
			or.setOptr_id(optr_id);
			or.setRole_id(role_id);
			this.daoFrameOptr.insert(or);
		} catch (Exception e) {
			throw new BusinessException("该操作员已经属于角色【" + role.getRole_name() + "】");
		}

	}

	/*******************
	 * 回收角色
	 */
	public void recoverRole(int optr_id, int role_id, FrameOptr optr) {
		FrameOptr op = this.daoFrameOptr.find(optr_id);
		if (optr.getOptr_id().intValue() != 0) {
			FrameAssertUtil.isEqual(optr.getOptr_id(), op.getCreate_optr(), "只有操作员的创建人才能回收权限！");
		}

		FrameOptrRole or = new FrameOptrRole();
		or.setOptr_id(optr_id);
		or.setRole_id(role_id);
		this.daoFrameOptr.deleteOptrRole(or);

	}

	/************************
	 * 上传操作员照片信息，base64保存到数据库
	 * 
	 * @param optr_id 操作员编号
	 * @param image_value base64编码
	 */
	public void uploadImage(int optr_id, String image_value) {
		FrameOptr optr = new FrameOptr();
		optr.setOptr_id(optr_id);
		optr.setOptr_image(image_value);
		this.daoFrameOptr.update(optr);

	}

}
