package com.takensoft.cms.mber.dao;

import com.takensoft.cms.mber.dto.JoinDTO;
import com.takensoft.cms.mber.dto.PasswordDTO;
import com.takensoft.cms.mber.vo.MberAuthorVO;
import com.takensoft.cms.mber.vo.MberVO;
import com.takensoft.common.Pagination;
import org.egovframe.rte.psl.dataaccess.mapper.Mapper;

import java.util.*;
/**
 * @author takensoft
 * @since 2024.04.01
 * @modification
 *     since    |    author    | description
 *  2024.04.01  |  takensoft   | 최초 등록
 *
 * 회원 정보 관련 Mapper
 */
@Mapper("mberDAO")
public interface MberDAO {
    /**
     * @param lgnId - 로그인 아이디
     * @return MberVO - 사용자 정보 조회 결과
     *
     * 사용자 정보 조회 [security 용]
     */
    MberVO findByMberSecurity(String lgnId);

    /**
     * @param lgnId - 로그인 아이디
     * @return boolean - 아이디 중복 여부
     *
     * 아이디 중복 검사
     */
    boolean findByCheckLoginId(String lgnId);

    /**
     * @param joinDTO - 회원 가입 관련 DTO
     * @return int - 회원가입 결과
     *
     * 회원가입
     */
    int save(JoinDTO joinDTO);

    /**
     * @param mberAuthorVO - 사용자 권한 관련 VO
     * @return int - 사용자 권한 등록 결과
     *
     * 사용자 권한 등록
     */
    int authorSave(MberAuthorVO mberAuthorVO);

    /**
     * @param passwordDTO -비밀 번호 변경 관련 DTO
     * @return int - 비밀 번호 변경 결과
     *
     * 비밀 번호 변경
     */
    int updatePassword(PasswordDTO passwordDTO);

    /**
     * @param mbrId -회원 아이디
     * @return MberVO - 사용자 정보 조회 결과
     *
     * 사용자 정보 조회
     */
    MberVO findByMber(String mbrId);

    /**
     * @param email - 이메일
     * @return MberVO - 사용자 정보
     *
     * 이메일로만 사용자 조회 (provider 무관)
     */
    MberVO findByEmail(String email);

    /**
     * @param email - 이메일
     * @param provider - OAuth2 제공자
     * @return MberVO - OAuth2 사용자 정보
     *
     * 이메일과 제공자로 사용자 조회
     */
    MberVO findByEmailAndProvider(String email, String mbrType);

    /**
     * @param mberVO - OAuth2 사용자 정보
     * @return int - OAuth2 사용자 저장 결과
     *
     * OAuth2 사용자 저장
     */
    int saveOAuthUser(MberVO mberVO);

    /**
     * @param mberVO - OAuth2 사용자 정보
     * @return int - OAuth2 사용자 업데이트 결과
     *
     * OAuth2 사용자 정보 업데이트
     */
    int updateOAuthUser(MberVO mberVO);

    /**
     * @param mberVO - OAuth2 연동 정보
     * @return int - 연동 결과
     *
     * 기존 계정에 OAuth2 정보 연동
     */
    int linkOAuth2Account(MberVO mberVO);

    /**
     * @param mbrId - 회원 ID
     * @return List<MberAuthorVO> - 회원 권한 목록
     *
     * 회원 ID로 권한 목록 조회
     */
    List<MberAuthorVO> findAuthoritiesByMbrId(String mbrId);
}