package com.takensoft.cms.token.service;

import com.takensoft.cms.token.vo.RefreshTknVO;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

/**
 * @author takensoft
 * @since 2024.04.01
 * @modification
 *     since    |    author    | description
 *  2024.04.01  |  takensoft   | 최초 등록
 *
 * RefreshToken 정보 관련 인터페이스
 */
public interface RefreshTokenService {

    /**
     * @param req - HTTP 요청 객체
     * @param res - HTTP 응답 객체
     * @param refresh - RefreshToken 정보
     * @param expiredMs - 토큰 만료 시간 (밀리초)
     * @return int - refresh token 등록결과
     *
     * refresh token 등록
     */
    public int saveRefreshToken(HttpServletRequest req, HttpServletResponse res, RefreshTknVO refresh, long expiredMs);

    /**
     * @param req - HTTP 요청 객체
     * @param res - HTTP 응답 객체
     * @return int - refresh token 삭제 결과
     *
     * refresh token 삭제 프로세스 (로그아웃)
     */
    public int deleteByRefresh(HttpServletRequest req, HttpServletResponse res);

    /**
     * @param req - HTTP 요청 객체
     * @param res - HTTP 응답 객체
     * @return int - 토큰 재발급 결과
     *
     * 토큰 재발급
     */
    public int tokenReissueProc(HttpServletRequest req, HttpServletResponse res);

    /**
     * @param req - HTTP 요청 객체
     * @param refreshTknVO - RefreshToken 정보
     * @return int - 토큰 삭제 결과
     *
     * 토큰 삭제
     */
    public int delete(HttpServletRequest req, RefreshTknVO refreshTknVO);

    /**
     * @param req - HTTP 요청 객체
     * @param refreshTknVO - RefreshToken 정보
     * @return boolean - refresh token 등록 여부
     *
     * refresh token 등록 여부 확인
     */
    public boolean findByCheckRefresh(HttpServletRequest req, RefreshTknVO refreshTknVO);

    /**
     * @return int - refresh token 전체 삭제 여부
     *
     * refresh token 전체 삭제
     */
    public int deleteAll();

    /**
     * @return String - 쿠키에 있는 refresh token 값
     * @param req - HTTP 요청 객체
     * 쿠키 내 refresh token 확인
     */
    public String getRefreshTokenFromCookie(HttpServletRequest req);
}
