/**
 * 请勿将俱乐部专享资源复制给其他人，保护知识产权即是保护我们所在的行业，进而保护我们自己的利益
 * 即便是公司的同事，也请尊重 JFinal 作者的努力与付出，不要复制给同事
 * <p>
 * 如果你尚未加入俱乐部，请立即删除该项目，或者现在加入俱乐部：http://jfinal.com/club
 * <p>
 * 俱乐部将提供 jfinal-club 项目文档与设计资源、专用 QQ 群，以及作者在俱乐部定期的分享与答疑，
 * 价值远比仅仅拥有 jfinal club 项目源代码要大得多
 * <p>
 * JFinal 俱乐部是五年以来首次寻求外部资源的尝试，以便于有资源创建更加
 * 高品质的产品与服务，为大家带来更大的价值，所以请大家多多支持，不要将
 * 首次的尝试扼杀在了摇篮之中
 */

package com.jfinal.club.common.interceptor;

import com.jfinal.aop.Inject;
import com.jfinal.aop.Interceptor;
import com.jfinal.aop.Invocation;
import com.jfinal.club._admin.login.LoginAdminService;
import com.jfinal.club.common.kit.IpKit;
import com.jfinal.club.common.model.Account;
import com.jfinal.club.common.model.Remind;
import com.jfinal.club.common.model.Users;
import com.jfinal.club.login.LoginService;
import com.jfinal.club.my.newsfeed.RemindService;
import com.jfinal.core.Controller;
import com.jfinal.core.JFinal;

/**
 * 从 cookie 中获取 sessionId，如果获取到则根据该值使用 LoginService
 * 得到登录的 Account 对象 ---> loginAccount，供后续的流程使用
 * <p>
 * 注意：将此拦截器设置为全局拦截器，所有 action 都需要
 */
public class LoginSessionInterceptor implements Interceptor {

    @Inject
    LoginService loginSrv;


    @Inject
    RemindService remindSrv;

    @Inject
    LoginAdminService loginAdminService;

    public static final String remindKey = "_remind";

    public void intercept(Invocation inv) {
        Users loginUsers = null;
        Controller c = inv.getController();
        String sessionId = c.getCookie(LoginService.sessionIdName);
        if (sessionId != null) {
            loginUsers = loginSrv.getLoginUsersWithSessionId(sessionId);
            if (loginUsers == null) {
                String loginIp = IpKit.getRealIp(c.getRequest());
                loginUsers = loginSrv.loginWithSessionIdUsers(sessionId, loginIp);
            }
            if (loginUsers != null) {
                // 用户登录账号
                c.setAttr(LoginService.loginUsersCacheName, loginUsers);
            } else {
                c.removeCookie(LoginService.sessionIdName); // cookie 登录未成功，证明该 cookie 已经没有用处，删之
            }
        }

        inv.getController().setAttr("context", JFinal.me().getContextPath());
        Account loginAccount = null;
        String sessionIds = c.getCookie(loginAdminService.sessionIdName);
        if (sessionIds != null) {
            loginAccount = loginAdminService.getLoginAccountWithSessionId(sessionIds);
            if (loginAccount == null) {
                String loginIp = IpKit.getRealIp(c.getRequest());
                loginAccount = loginAdminService.loginWithSessionId(sessionIds, loginIp);
            }
            if (loginAccount != null) {
                // 用户登录账号
                c.setAttr(loginAdminService.loginAccountCacheName, loginAccount);
            } else {
                c.removeCookie(loginAdminService.sessionIdName); // cookie 登录未成功，证明该 cookie 已经没有用处，删之
            }
        }

        inv.invoke();

        if (loginAccount != null) {
            // remind 对象用于生成提醒 tips
            Remind remind = remindSrv.getRemind(loginAccount.getId());
            if (remind != null) {
                if (remind.getReferMe() > 0 || remind.getMessage() > 0 || remind.getFans() > 0) {
                    c.setAttr(remindKey, remind);
                }
            }
        }
    }

}



