package com.pj.sso;

import javax.servlet.http.HttpServletRequest;

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

import com.dtflys.forest.Forest;
import com.pj.project.sys_user.SysUser;

import cn.dev33.satoken.config.SaSsoConfig;
import cn.dev33.satoken.sso.SaSsoProcessor;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;

/**
 * Sa-Token-SSO Client端 Controller 
 * @author kong
 */
@RestController
public class SsoClientController {

	// 进入首页 
	@RequestMapping("/")
	public Object index(HttpServletRequest request) {
		request.setAttribute("isLogin", StpUtil.isLogin());
		if(StpUtil.isLogin()) {
			request.setAttribute("user", StpUtil.getSession().get("user", new SysUser()));
		}
		return new ModelAndView("index.html");
	}
	
	// SSO-Client端：处理所有SSO相关请求 
	@RequestMapping("/sso/*")
	public Object ssoRequest() {
		return SaSsoProcessor.instance.clientDister();
	}

    // 重写 /sso/login 增加逻辑：在登录后获取 User 对象缓存到当前Client端的 Session 上 
    @RequestMapping("/sso/login")
    public Object ssoDoLogin(String ticket) {
    	Object value = SaSsoProcessor.instance.ssoLogin();
    	if(ticket != null && StpUtil.isLogin()) {
    		StpUtil.getSession().set("user", SsoMethodUtil.getCurrUser());
    	}
        return value;
    }

	// 配置SSO相关参数 
	@Autowired
	private void configSso(SaSsoConfig sso) {

	    // 配置 Http 请求处理器
	    sso.setSendHttp(url -> {
	        System.out.println("发起请求：" + url);
	        return Forest.get(url).executeAsString();
	    });
	}

	// 进入info页（只有登录后才可以访问此页面）
	@RequestMapping("/info.html")
	public Object info() {
		return new ModelAndView("info.html");
	}

	// getInfo接口 （只有登录后才可以调用此接口）
	@RequestMapping("/getCurrInfo")
	public Object getCurrInfo() {
		// 必须登录后才能进入接口  
		StpUtil.checkLogin();
		
		// 从Session中获取user对象 
		SysUser user = (SysUser)StpUtil.getSession().get("user");
		return SaResult.data(user);
	}
	
}
