package cn.reghao.tnb.auth.app.service;

import cn.reghao.tnb.auth.app.model.vo.AccountToken;
import cn.reghao.tnb.auth.app.security.form.AccountAuthToken;
import org.springframework.security.core.Authentication;

/**
 * @author reghao
 * @date 2023-02-16 14:57:49
 */
public interface AccountTokenService {
    /**
     * 颁发用户令牌
     *
     * @param
     * @return
     * @date 2023-02-17 14:29:32
     */
    AccountToken grantUserToken(AccountAuthToken authToken);
    /**
     * 设置用户 cookie
     *
     * @param
     * @return
     * @date 2025-08-28 14:54:02
     */
    void setCookie(AccountAuthToken authToken, long timeout);
    /**
     * 使用刷新令牌颁发新令牌
     *
     * @param
     * @return
     * @date 2023-10-20 09:44:55
     */
    AccountToken getUserToken(String refreshToken) throws Exception;

    /**
     * 根据 token 获取已认证用户的 ID
     *
     * @param
     * @return
     * @date 2025-08-28 15:16:58
     */
    @Deprecated
    long getUserId(int tokenType, String userdata);

    /**
     * 从 SecurityContextHolder 中获取 Authentication
     *
     * @param
     * @return
     * @date 2025-08-28 15:09:20
     */
    Authentication getAuthentication();
    /**
     * 从 SecurityContextHolder 中获取 AccountAuthToken
     *
     * @param
     * @return
     * @date 2025-08-28 14:52:39
     */
    AccountAuthToken getAuthToken();
    /**
     * 从 cookie 或 token 中读取已认证用户的 AccountAuthToken
     *
     * @param
     * @return
     * @date 2023-10-19 18:38:43
     */
    AccountAuthToken getAuthToken(int tokenType, String userdata);

    void clearCookie();
    /**
     * 重置密码后, 删除所有与用户关联认证数据
     *
     * @param
     * @return
     * @date 2023-02-20 14:30:44
     */
    void logout(long userId);
    /**
     * 登出其他设备
     *
     * @param
     * @return
     * @date 2025-08-28 16:29:25
     */
    void logout(String loginId);
    /**
     * 登出当前设备
     *
     * @param
     * @return
     * @date 2025-08-28 16:29:15
     */
    void logout();
    void deleteOnSessionExpired(String loginId);
}
