package com.pj.project.sys_user;

import java.util.Date;

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

import com.pj.utils.sg.AjaxError;
import com.pj.utils.sg.NbUtil;

import cn.hutool.core.lang.Validator;

/**
 * 工具类：sys_user -- 用户表
 * @author shengzhang 
 *
 */
@Component
public class SysUserUtil {

	/** 底层 Mapper 对象 */
	public static SysUserMapper sysUserMapper;
	@Autowired
	private void setSysUserMapper(SysUserMapper sysUserMapper) {
		SysUserUtil.sysUserMapper = sysUserMapper;
	}

	/** 底层 Service 对象 */
	public static SysUserService sysUserService;
	@Autowired
	private void setSysUserService(SysUserService sysUserService) {
		SysUserUtil.sysUserService = sysUserService;
	}

	// 校验一个账号的id是否可用 
	static void checkUserId(SysUser s) {
		// 如果没有指定，或者指定了为0，说明其想要自增，直接通过 
		if(s.getId() == null || s.getId() == 0L) {
			return;
		}
		// 不为0，需要检查一下此id是否已经有人使用
		SysUser s2 = sysUserMapper.getById(s.getId());
		AjaxError.notTrue(s2 != null, "该用户id已注册，请更换");	
	}
	
	// 校验一个账号的昵称是否可用 
	static void checkUsername(SysUser s) {
		AjaxError.notTrue(NbUtil.isNull(s.getUsername()), "昵称不能为空");	
		AjaxError.notTrue(NbUtil.isNumber(s.getUsername()), "昵称不能为纯数字");	
		AjaxError.notTrue(Validator.isEmail(s.getUsername()), "昵称不能是一个邮箱");	

		SysUser s2 = sysUserMapper.getByUsername(s.getUsername());
		AjaxError.notTrue(s2 != null && (long)s2.getId() != s.getId(), "该昵称已注册：" + s.getUsername());	
	}
	
	// 校验一个账号的phone是否可用 
	static void checkPhone(SysUser s) {
		if(NbUtil.isNull(s.getPhone()) == false) {
			AjaxError.notTrue(NbUtil.isPhone(s.getPhone()) == false, "手机号格式不正确：" + s.getPhone());	
			SysUser s2 = sysUserMapper.getByPhone(s.getPhone());
			AjaxError.notTrue(s2 != null && (long)s2.getId() != s.getId(), "该手机号已注册：" + s.getPhone());	
		}
	}
	
	// 校验一个账号的邮箱是否可用 
	static void checkEmail(SysUser s) {
		if(NbUtil.isNull(s.getEmail()) == false) {
			AjaxError.notTrue(NbUtil.isEmail(s.getEmail()) == false, "邮箱格式不正确：" + s.getEmail());	
			SysUser s2 = sysUserMapper.getByEmail(s.getEmail());
			AjaxError.notTrue(s2 != null && (long)s2.getId() != s.getId(), "邮箱已注册：" + s.getEmail());	
		}
	}

	/** 
	 * 在 add 时对一个 SysUser 对象进行进行数据完整性
	 */
	static void checkByAdd(SysUser s) {
		checkUserId(s);
		checkUsername(s);
		AjaxError.notIsNull(s.getPassword2(), "[ 用户密码 ] 不能为空");		// 验证: 用户密码 
		AjaxError.notTrue(s.getPassword2().length() < 6 || s.getPassword2().length() > 20 , "[ 用户密码 ] 长度应该保持在6-20位之内");	// 验证: 用户密码 
		AjaxError.notIsNull(s.getAvatar(), "[ 用户头像 ] 不能为空");		// 验证: 用户头像  
		AjaxError.notIsNull(s.getSex(), "[ 用户性别 ] 不能为空");		// 验证: 用户性别 (1=男,2=女,3=未知) 
		AjaxError.notIsNull(s.getSex() < 1 || s.getSex() > 3, "[ 用户性别 ] 取值错误：" + s.getSex());	// 验证: 用户性别 (1=男,2=女,3=未知) 
		checkPhone(s);
		checkEmail(s);
	}

	/** 
	 * 在 update 时对一个 SysUser 对象进行进行数据完整性校验 
	 */
	static void checkByUpdate(SysUser s) {
		AjaxError.notIsNull(s.getId(), "[ 账号id ] 不能为空");		// 验证: id号 
		checkUsername(s);
		AjaxError.notIsNull(s.getAvatar(), "[ 用户头像 ] 不能为空");		// 验证: 用户头像 
		AjaxError.notIsNull(s.getSex(), "[ 用户性别 ] 不能为空");		// 验证: 用户性别 (1=男,2=女,3=未知) 
		AjaxError.notTrue(s.getSex() < 1 || s.getSex() > 3, "[ 用户性别 ] 取值错误：" + s.getSex());	// 验证: 用户性别 (1=男,2=女,3=未知) 
		AjaxError.notIsNull(s.getStatus(), "[ 用户状态 ] 不能为空");		// 验证: 用户状态 (1=正常,2=禁用) 
		AjaxError.notTrue(s.getStatus() < 1 || s.getStatus() > 2, "[ 用户状态 ] 取值错误：" + s.getStatus());	// 验证: 用户状态 (1=正常,2=禁用) 
		checkPhone(s);
		checkEmail(s);
	}

	/** 
	 * 获取一个SysUser (方便复制代码用) [G] 
	 */ 
	static SysUser getSysUser() {
		SysUser s = new SysUser();	// 声明对象 
		s.setId(0L);		// id号 
		s.setUsername("");		// 用户昵称 
		s.setPassword("");		// 账号密码 
		s.setAvatar("");		// 用户头像 
		s.setIntro("");		// 个人介绍(签名) 
		s.setAge(0);		// 用户年龄 
		s.setSex(0);		// 用户性别 (1=男,2=女,3=未知) 
		s.setPhone("");		// 手机号 
		s.setEmail("");		// 用户邮箱 
		s.setStatus(0);		// 账号状态(1=正常,2=禁用) 
		s.setCreateTime(new Date());		// 创建时间 
		s.setLoginTime(new Date());		// 上次登陆时间 
		s.setLoginIp("");		// 上次登陆IP 
		s.setLoginCount(0);		// 登陆次数 
		return s;
	}

    /**
     * 根据id查询用户 
     */
    public static SysUser getById(long id) {
        return sysUserMapper.getById(id);	
    }

}
