package com.pj.project.sys_user_acc;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.pj.current.satoken.StpUserUtil;
import com.pj.project.sys_user.SysUser;
import com.pj.project.sys_user.SysUserUtil;
import com.pj.project.sys_user_sync.brd.SspServerBrdUtil;
import com.pj.project4sp.config.SpConfigUtil;
import com.pj.utils.VcUtil;
import com.pj.utils.sg.AjaxError;
import com.pj.utils.sg.AjaxJson;
import com.pj.utils.sg.NbUtil;

/**
 * 用户模块，有关验证码的相关操作UserMapper.xml
 * UserMapper
 * @author kong
 */
@RestController
@RequestMapping("/SysUserAcc/")
public class SysUserAccController {

    @Autowired
    SysUserAccMapper sysUserAccMapper;

    @Autowired
    SysUserAccService sysUserAccService;

    // -------------------------- 登录相关 --------------------------

    /** 验证码登录 -> 发送验证码 */
    @RequestMapping("loginByPhone_sendVc")
    AjaxJson loginByPhone_sendVc(String phone) {
        VcUtil.send(VcUtil.USER_LOGIN, phone);
        return AjaxJson.getSuccess();
    }

    /** 验证码登录 -> 确认 */
    @RequestMapping("loginByPhone_ok")
	@Transactional(rollbackFor = Exception.class)	
    AjaxJson loginByPhone_ok(String phone, String vc) {
        // 先验证
        VcUtil.check(VcUtil.USER_LOGIN, phone, vc);
        
        // 检查登录信息
        boolean isNew = false; // 此变量含义：该手机号是否为首次登录 
        SysUserAcc userAcc = sysUserAccMapper.getByPhone(phone);
        if(userAcc == null) {
        	// 如果查询不到，则直接自动注册一个  
        	// 先检查系统配置是否允许注册 
        	if(SpConfigUtil.isAllowRegister() == false) {
        		return AjaxJson.getError("登录失败：系统暂未开放注册新用户，如有疑问，请联系网站管理员");
        	}
        	
        	// 开始注册
        	userAcc = sysUserAccService.regByPhone(phone);	
        	isNew = true;
        }
        
		// 账号能否登录的判断 
        if(userAcc.getStatus() == 2) {
		    AjaxError.throwMsg("此账号已被禁用，如有疑问，请联系平台管理员");
		}
        
        // 登录成功后删除验证码 
        VcUtil.delete(VcUtil.USER_LOGIN, phone);
        
        if(isNew) {
    		// $$ 向外广播
    		SysUser s2 = SysUserUtil.sysUserMapper.getByPhone(phone);
    		SspServerBrdUtil.userAdd(s2, null);
        }

        // 返回信息 
        return successLoginInfo(userAcc.getId()).set("isNew", isNew);
    }

    /** id/昵称/手机号/邮箱 + 密码登录 */
    @RequestMapping("doLogin")
    AjaxJson doLogin(String name, String pwd) {

        // 校验参数 
    	if(NbUtil.hasNull(name, pwd)) {
    		return AjaxJson.getError("请输入");
    	}

        // 获取相应用户
        SysUserAcc userAcc = sysUserAccService.doLogin(name, pwd);

        // 返回信息 
        return successLoginInfo(userAcc.getId());
    }

	/** 注销登录 */
	@RequestMapping("doExit")
	AjaxJson doExit() {
		StpUserUtil.logout();
		return AjaxJson.getSuccess();
	}

    // 返回指定账号登录信息 
    private AjaxJson successLoginInfo(long userId) {

        // 调用 Sa-Token 登录会话 
        StpUserUtil.login(userId);    
        
        // 将User对象写入User-Session，以便所有Client端可以取到 
        Object user = SysUserAccUtil.getUserById(userId);
        StpUserUtil.getSession().set("user", user);

        // 返回账号数据 
		return AjaxJson.getSuccess()
                .set("userId", userId)     // 用户id
                .set("user", user)    // 用户信息 
                .set("tokenInfo", StpUserUtil.getTokenInfo());  // token信息 
	}
  
}
