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.MberSocialAccountVO;
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   | 최초 등록
 *  2025.05.29  |  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 params
     *  - eml: 이메일 정보
     *  - mbrId: 회원 아이디
     * @return MberVO - 사용자 정보
     *
     * 이메일로만 사용자 조회 (provider 무관)
     */
    MberVO findByEmail(HashMap<String, Object> params);

    /**
     * @param email - 이메일
     * @param mbrType - OAuth2 회원 유형 (K, N, G, F, S)
     * @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);

    // ===================================
    // 통합 로그인을 위한 새로운 메서드들
    // ===================================

    /**
     * @param params - 제공자 타입과 식별자를 포함한 Map
     *               - lgnOffrType: 제공자 타입 (SYSTEM, KAKAO, NAVER, GOOGLE)
     *               - identifier: 식별자 (로그인ID 또는 소셜ID)
     * @return MberVO - 통합 로그인으로 조회된 사용자 정보
     *
     * 통합 로그인: 제공자별 사용자 조회
     */
    MberVO findByUnifiedLogin(HashMap<String, Object> params);

    /**
     * @param email - 이메일
     * @return MberVO - 이메일로 조회된 사용자 정보 (첫 번째 계정)
     *
     * 이메일로 모든 연동 계정 조회 (통합용)
     */
    MberVO findAllAccountsByEmail(String email);

    /**
     * @param mbrId - 회원 ID
     * @return List<MberSocialAccountVO> - 소셜 계정 목록
     *
     * 회원 ID로 소셜 계정 목록 조회
     */
    List<MberSocialAccountVO> findSocialAccountsByMbrId(String mbrId);

    /**
     * @param params - 회원 ID와 제공자 타입을 포함한 Map
     *               - mbrId: 회원 ID
     *               - lgnOffrType: 제공자 타입
     * @return MberSocialAccountVO - 특정 제공자의 소셜 계정 정보
     *
     * 특정 제공자로 소셜 계정 조회
     */
    MberSocialAccountVO findSocialAccountByProvider(HashMap<String, Object> params);

    /**
     * @param socialAccount - 소셜 계정 정보
     * @return int - 저장 결과
     *
     * 소셜 계정 정보 저장
     */
    int saveSocialAccount(MberSocialAccountVO socialAccount);

    /**
     * @param socialAccount - 소셜 계정 연동 정보
     * @return int - 연동 결과
     *
     * 소셜 계정 연동 (중복 시 업데이트)
     */
    int linkSocialAccount(MberSocialAccountVO socialAccount);

    /**
     * @param params - 연동 해지 정보를 포함한 Map
     *               - mbrId: 회원 ID
     *               - lgnOffrType: 제공자 타입
     *               - mdfr: 수정자
     * @return int - 해지 결과
     *
     * 소셜 계정 연동 해지
     */
    int unlinkSocialAccount(HashMap<String, Object> params);

    /**
     * @param params - 메인 프로필 설정 정보를 포함한 Map
     *               - mbrId: 회원 ID
     *               - lgnOffrType: 제공자 타입
     *               - mdfr: 수정자
     * @return int - 설정 결과
     *
     * 메인 프로필 설정
     */
    int setPrimaryProfile(HashMap<String, Object> params);

    /**
     * @param params - 연동 가능한 계정 검색 정보를 포함한 Map
     *               - email: 이메일
     *               - lgnOffrType: 제외할 제공자 타입
     * @return MberVO - 연동 가능한 계정 정보
     *
     * 연동 가능한 계정 조회 (이메일로 검색, 특정 제공자 제외)
     */
    MberVO findLinkableAccount(HashMap<String, Object> params);
}