package com.pj.project4sp.admin4acc;

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

import com.pj.current.satoken.AuthConst;
import com.pj.project4sp.admin.SpAdmin;
import com.pj.project4sp.admin.SpAdminUtil;
import com.pj.project4sp.config.SpConfigUtil;
import com.pj.project4sp.menu.SpMenuUtil;
import com.pj.project4sp.role4permission.SpRolePermissionService;
import com.pj.utils.sg.AjaxError;
import com.pj.utils.sg.AjaxJson;
import com.pj.utils.sg.IpCheckUtil;
import com.pj.utils.sg.NbUtil;
import com.pj.utils.so.SoMap;

import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.temp.SaTempUtil;

/**
 * Admin账号相关的接口 
 * 
 * @author kong
 *
 */
@RestController
@RequestMapping("/AccAdmin/")
public class SpAccAdminController {

	@Autowired
	SpAccAdminService spAccAdminService;
	
	@Autowired
	SpRolePermissionService spRolePermissionService;
	
	/** 账号、密码登录  */
	@RequestMapping("doLogin")
	AjaxJson doLogin(String key, String password) {
		IpCheckUtil.checkResToNow("admin-login", 1);
		// 1、验证参数 
		if(NbUtil.hasNull(key, password)) {
			return AjaxJson.getError("请提供key与password参数");
		}
		return spAccAdminService.doLogin(key, password);
	}

	/** 退出登录  */
	@RequestMapping("doExit")
	AjaxJson doExit() {
		StpUtil.logout();
		return AjaxJson.getSuccess();
	}
	
	/** 获取会话信息 */
	@RequestMapping("getLoginInfo")
	AjaxJson getLoginInfo() {
		
		// 当前admin
		SpAdmin admin = SpAdminUtil.getCurrAdmin();
		
		// 组织参数 (admin信息，权限信息，配置信息)
		SoMap map = new SoMap();
		map.set("admin", admin);	
		map.set("menuList", SpMenuUtil.getList(admin.getRoleId()));
		map.set("perList", spRolePermissionService.getPcodeByRid(admin.getRoleId()));				
		map.set("appCfg", SpConfigUtil.getAppConfig());	
		return AjaxJson.getSuccessData(map); 
	}

	/** 获取指定账号的快速登录临时Temp-Token */
	@RequestMapping("getFastLoginTempToken")
	@SaCheckPermission({AuthConst.ADMIN_LIST, AuthConst.ROOT})
	AjaxJson getFastLoginTempToken(long id) {
		// 如果不存在这个账号 
		if(SpAdminUtil.spAdminMapper.getById(id) == null) {
			return AjaxJson.getError("未找到账号：" + id);
		}
		// 如果要模拟的账号就是当前账号 
		if(StpUtil.getLoginIdAsLong() == id) {
			return AjaxJson.getError("不能自己模拟自己");
		}
		
		// 获取这个人的临时认证 Token 
		String tempToken = SaTempUtil.createToken("admin-login", id, 60 * 5);
		return AjaxJson.getSuccessData(tempToken);
	}
	
	/** Temp-Token 快速登录  */
	@RequestMapping("doLoginByTempToken")
	AjaxJson doLoginByTempToken(String tempToken) {
		// 解析 Token 
		Object adminId = SaTempUtil.parseToken("admin-login", tempToken);
		AjaxError.notIsNull(adminId, "无效Temp-Token，快速登录失败，请手动输入账号密码登录");

		// 登录 
		StpUtil.login(adminId);
		
		// 删除这个 temp-token，使其只能用一次
		SaTempUtil.deleteToken("admin-login", tempToken);
		
        // 返回 Token 信息 
		SoMap map = new SoMap();
		map.put("admin", SpAdminUtil.getCurrAdmin());
		map.put("tokenInfo", StpUtil.getTokenInfo());
		return AjaxJson.getSuccessData(map);	
	}
	
}
