package com.pj.project.sys_client_visit;

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

import com.pj.project.sys_client.SysClient;
import com.pj.project.sys_client.SysClientUtil;
import com.pj.project.sys_user.SysUserUtil;
import com.pj.utils.sg.AjaxError;

/**
 * 工具类：sys_client_visit -- 应用访问关系表
 * @author click33 
 *
 */
@Component
public class SysClientVisitUtil {

	
	/** 底层 Mapper 对象 */
	public static SysClientVisitMapper sysClientVisitMapper;
	@Autowired
	private void setSysClientVisitMapper(SysClientVisitMapper sysClientVisitMapper) {
		SysClientVisitUtil.sysClientVisitMapper = sysClientVisitMapper;
	}
	
	
	/** 
	 * 将一个 SysClientVisit 对象进行进行数据完整性校验 (方便add/update等接口数据校验)
	 */
	static void check(SysClientVisit s) {
		AjaxError.notIsNull(s.getClientId(), "[ 应用id ] 不能为空");		// 验证: 应用ID 
		AjaxError.notIsNull(SysClientUtil.sysClientMapper.getById(s.getClientId()), "所填的 [ 应用id ] 未能找到对应的应用");		// 验证: 应用ID 
		AjaxError.notIsNull(s.getUserId(), "[ 用户id ] 不能为空");		// 验证: 用户ID 
		AjaxError.notIsNull(SysUserUtil.sysUserMapper.getById(s.getUserId()), "所填的 [ 用户id ] 未能找到对应的用户");		// 验证: 用户ID 
		AjaxError.notIsNull(s.getVisit(), "[ 所属关系 ] 不能为空");		// 验证: 所属关系 (1=允许访问,2=禁止访问, 3=跟随应用) 
		AjaxError.notTrue(s.getVisit() < 1 || s.getVisit() > 3, "[ 所属关系 ] 数据无效：" + s.getVisit());		// 验证: 所属关系 (1=允许访问,2=禁止访问, 3=跟随应用) 
	}

	/** 
	 * 获取一个SysClientVisit (方便复制代码用) [G] 
	 */ 
	static SysClientVisit getSysClientVisit() {
		SysClientVisit s = new SysClientVisit();	// 声明对象 
		s.setId(0L);		// 记录id 
		s.setClientId(0L);		// 应用ID 
		s.setUserId(0L);		// 用户ID 
		s.setVisit(0);		// 所属关系 (1=允许访问,2=禁止访问, 3=跟随应用) 
		s.setCreateTime("");		// 创建时间 
		return s;
	}

	/**
	 * 判断指定用户是否可以登录指定应用 
	 */
	public static boolean isSureLogin(long userId, long clientId) {
		SysClientVisit model = sysClientVisitMapper.getByClientAndUserId(clientId, userId);
		// 情况1、指定了允许登录 
		if(model != null && model.getVisit() == 1) {
			return true;
		}
		
		// 情况2、指定了禁止登录 
		if(model != null && model.getVisit() == 2) {
			return false;
		}
		
		// 情况3、没有指定访问关系，此时需要根据应用是否公开来判断：私有应用禁止登录、公开应用允许登录 
		SysClient client = SysClientUtil.sysClientMapper.getById(clientId);	
		if(client == null) {
			return false;
		}
		return client.getIsPublic() == 1;
	}

	/**
	 * 判断指定用户是否可以登录指定应用 
	 */
	public static boolean isSureLogin(long userId, String redirect) {
		AjaxError.notIsNull(redirect, "缺少 redirect参数");
		return isSureLogin(userId, SysClientUtil.getClientIdByUrl(redirect));
	}
	
}
