package go.kr.project.system.loginLog.service;

import go.kr.project.system.loginLog.model.LoginLogSearchVO;
import go.kr.project.system.loginLog.model.LoginLogVO;

import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;

/**
 * packageName    : go.kr.project.login.service
 * fileName       : LoginLogService
 * author         : 시스템 관리자
 * date           : 2025-05-13
 * description    : 로그인 로그 관련 서비스 인터페이스
 * ===========================================================
 * DATE              AUTHOR             NOTE
 * -----------------------------------------------------------
 * 2025-05-13        시스템 관리자       최초 생성
 */
public interface LoginLogService {

    /**
     * 로그인 성공 로그를 기록합니다.
     * 
     * @param userId 사용자 ID
     * @param userAcnt 사용자 계정
     * @param request HTTP 요청 객체
     * @return 저장된 로그인 로그 정보
     */
    LoginLogVO recordLoginSuccess(String userId, String userAcnt, HttpServletRequest request);

    /**
     * 로그인 실패 로그를 기록합니다.
     * 
     * @param userAcnt 사용자 계정
     * @param failReason 실패 사유
     * @param request HTTP 요청 객체
     * @return 저장된 로그인 로그 정보
     */
    LoginLogVO recordLoginFailure(String userAcnt, String failReason, HttpServletRequest request);

    /**
     * 로그인 로그를 조회합니다.
     * 
     * @param logId 로그 ID
     * @return 로그인 로그 정보
     */
    LoginLogVO getLoginLog(String logId);

    /**
     * 조건에 맞는 로그인 로그 목록을 조회합니다.
     *
     * @param paramVO 조회 조건
     * @return 로그인 로그 목록
     */
    List<LoginLogVO> getLoginLogList(LoginLogSearchVO paramVO);

    /**
     * 조건에 맞는 로그인 로그 개수를 조회합니다.
     *
     * @param paramVO 조회 조건
     * @return 로그인 로그 개수
     */
    int getLoginLogCount(LoginLogSearchVO paramVO);

    /**
     * 특정 사용자의 최근 로그인 기록을 조회합니다.
     * 
     * @param userAcnt 사용자 계정
     * @param limit 조회할 기록 수
     * @return 최근 로그인 기록 목록
     */
    List<LoginLogVO> getRecentLoginLogs(String userAcnt, int limit);

    /**
     * 특정 기간 내 사용자의 로그인 실패 횟수를 조회합니다.
     * 
     * @param userAcnt 사용자 계정
     * @param hours 조회할 시간 범위(시간 단위)
     * @return 로그인 실패 횟수
     */
    int getLoginFailureCount(String userAcnt, int hours);

    /**
     * 특정 사용자의 다른 디바이스에서의 로그인 기록을 조회합니다.
     * 
     * @param userAcnt 사용자 계정
     * @param deviceInfo 현재 디바이스 정보
     * @param hours 조회할 시간 범위(시간 단위)
     * @return 다른 디바이스에서의 로그인 기록 목록
     */
    List<LoginLogVO> getDifferentDeviceLogins(String userAcnt, String deviceInfo, int hours);

    /**
     * 특정 IP 주소에서의 로그인 시도 횟수를 조회합니다.
     * 
     * @param ipAddr IP 주소
     * @param hours 조회할 시간 범위(시간 단위)
     * @return 로그인 시도 횟수
     */
    int getLoginAttemptsByIp(String ipAddr, int hours);

    /**
     * 로그인 시도가 비정상적인 패턴인지 확인합니다.
     * 
     * @param userAcnt 사용자 계정
     * @param request HTTP 요청 객체
     * @return 비정상적인 패턴 여부 및 사유를 담은 Map 객체
     */
    Map<String, Object> checkAbnormalLoginPattern(String userAcnt, HttpServletRequest request);

    /**
     * 디바이스 유형별 로그인 통계를 조회합니다.
     * 
     * @param params 조회 조건 (startDate, endDate, successYn 등)
     * @return 디바이스 유형별 로그인 횟수 목록
     */
    List<Map<String, Object>> getDeviceTypeStats(Map<String, Object> params);

    /**
     * 로그인 성공/실패 비율 통계를 조회합니다.
     * 
     * @param params 조회 조건 (startDate, endDate, deviceInfo 등)
     * @return 성공/실패 횟수 목록
     */
    List<Map<String, Object>> getSuccessFailStats(Map<String, Object> params);

    /**
     * 시간대별 로그인 시도 통계를 조회합니다.
     * 
     * @param params 조회 조건 (startDate, endDate, deviceInfo 등)
     * @return 시간대별 로그인 시도 횟수 목록
     */
    List<Map<String, Object>> getHourlyLoginStats(Map<String, Object> params);
}
