package com.chinaweal.aiccs.org.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.chinaweal.aiccs.org.entity.OauthAccessToken;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Update;

/**
 * <p>
 * OAuth访问令牌 Mapper 接口
 * </p>
 *
 * @author chinaweal
 * @since 2025-11-21
 */
public interface OauthAccessTokenMapper extends BaseMapper<OauthAccessToken> {

    /**
     * 根据访问令牌查询信息
     *
     * @param accessToken 访问令牌
     * @return 令牌信息
     */
    OauthAccessToken selectByAccessToken(@Param("accessToken") String accessToken);

    /**
     * 根据刷新令牌查询信息
     *
     * @param refreshToken 刷新令牌
     * @return 令牌信息
     */
    OauthAccessToken selectByRefreshToken(@Param("refreshToken") String refreshToken);

    /**
     * 根据刷新令牌和客户端ID查询信息
     *
     * @param refreshToken 刷新令牌
     * @param clientId 客户端ID
     * @return 令牌信息
     */
    OauthAccessToken selectByRefreshTokenAndClientId(@Param("refreshToken") String refreshToken,
                                                    @Param("clientId") String clientId);

    /**
     * 根据用户ID和客户端ID查询有效的访问令牌
     *
     * @param userId 用户ID
     * @param clientId 客户端ID
     * @return 令牌信息
     */
    OauthAccessToken selectActiveByUserIdAndClientId(@Param("userId") String userId,
                                                    @Param("clientId") String clientId);

    /**
     * 撤销访问令牌
     *
     * @param accessToken 访问令牌
     * @return 更新行数
     */
    @Update("UPDATE oauth_access_token SET is_active = '0', update_time = NOW() WHERE access_token = #{accessToken}")
    int revokeAccessToken(@Param("accessToken") String accessToken);

    /**
     * 撤销刷新令牌
     *
     * @param refreshToken 刷新令牌
     * @return 更新行数
     */
    @Update("UPDATE oauth_access_token SET is_active = '0', update_time = NOW() WHERE refresh_token = #{refreshToken}")
    int revokeRefreshToken(@Param("refreshToken") String refreshToken);

    /**
     * 撤销用户在指定客户端的所有令牌
     *
     * @param userId 用户ID
     * @param clientId 客户端ID
     * @return 更新行数
     */
    @Update("UPDATE oauth_access_token SET is_active = '0', update_time = NOW() WHERE user_id = #{userId} AND client_id = #{clientId}")
    int revokeTokensByUserAndClient(@Param("userId") String userId, @Param("clientId") String clientId);

    /**
     * 将过期的令牌标记为无效
     *
     * @return 更新行数
     */
    @Update("UPDATE oauth_access_token SET is_active = '0', update_time = NOW() WHERE expires_in < NOW() AND is_active = '1'")
    int markExpiredAsInactive();

    /**
     * 将过期的刷新令牌标记为无效
     *
     * @return 更新行数
     */
    @Update("UPDATE oauth_access_token SET refresh_token = NULL, update_time = NOW() WHERE refresh_expires_in < NOW() AND refresh_token IS NOT NULL")
    int markExpiredRefreshTokenAsInactive();

}