package com.takensoft.cms.mber.service;

import com.takensoft.cms.mber.dto.JoinDTO;
import com.takensoft.cms.mber.dto.PasswordDTO;
import com.takensoft.cms.mber.vo.MberVO;

import jakarta.servlet.http.HttpServletRequest;
import org.springframework.dao.DataAccessException;

import java.util.*;
/**
 * @author takensoft
 * @since 2024.04.01
 * @modification
 *     since    |    author    | description
 *  2024.04.01  |  takensoft   | 최초 등록
 *  2025.06.20  |    하석형     | findByCheckEmail 추가
 *
 * 회원 정보 관련 인터페이스
 */
public interface MberService {

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

    /**
     * @param params
     *  - eml: 이메일 정보
     *  - mbrId: 회원 아이디
     * @return boolean - 이메일 중복 여부
     *
     * 이메일 중복 검사
     */
    public boolean findByCheckEmail(HashMap<String, Object> params);

    /**
     * @param req - HTTP 요청 객체
     * @param joinDTO -회원정보
     * @return HashMap<String, Object> - 회원정보 등록 결과
     *  - mbrId : 회원 아이디
     *  - result : 회원등록정보 결과
     *
     * 회원가입
     */
    public HashMap<String, Object> userJoin(HttpServletRequest req, JoinDTO joinDTO);

    /**
     * @param passwordDTO - 비밀번호
     * @return boolean - 비밀번호 사용 가능 여부
     *
     * 비밀번호 비교
     */
    public boolean passwordCheck(PasswordDTO passwordDTO);

    /**
     * @param params
     *  - 회원 아이디
     * @return MberVO - 회원 정보
     *
     * 회원정보 상세 조회
     */
    public MberVO findByMbr(HashMap<String, Object> params);

    /**
     * @param passwordDTO - 비밀번호
     * @return int - 비밀번호 수정 결과
     *
     * 비밀번호 수정
     */
    public int updatePassword(PasswordDTO passwordDTO);

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

    /**
     * @param email - 이메일
     * @param mbrType - 회원 유형 (K, N, G, F, S)
     * @return MberVO - 사용자 정보
     *
     * 이메일과 회원 유형으로 사용자 조회
     */
    public MberVO findByEmailAndProvider(String email, String mbrType);

    /**
     * @param user - OAuth2 사용자 정보
     * @return MberVO - 저장된 사용자 정보
     *
     * OAuth2 사용자 저장
     */
    public MberVO saveOAuthUser(MberVO user, HttpServletRequest request);

    /**
     * @param user - OAuth2 사용자 정보
     * @return MberVO - 업데이트된 사용자 정보
     *
     * OAuth2 사용자 정보 업데이트
     */
    public MberVO updateOAuthUser(MberVO user);

    /**
     * @param user - OAuth2 연동 정보가 추가된 사용자 정보
     * @return MberVO - 연동된 사용자 정보
     *
     * 기존 계정에 OAuth2 정보 연동
     */
    public MberVO linkOAuth2Account(MberVO user);
}