package com.takensoft.cms.mber.service;

import com.takensoft.cms.mber.vo.MberSocialAccountVO;
import com.takensoft.cms.mber.vo.MberVO;
import jakarta.servlet.http.HttpServletRequest;

import java.util.HashMap;
import java.util.List;

/**
 * @author takensoft
 * @since 2025.05.29
 * @modification
 *     since    |    author    | description
 *  2025.05.29  |  takensoft   | 최초 등록
 *
 * 통합 로그인 서비스 인터페이스
 */
public interface UnifiedLoginService {

    /**
     * 통합 로그인 인증
     * @param lgnOffrType 제공자 타입 (SYSTEM, KAKAO, NAVER, GOOGLE)
     * @param identifier 식별자 (로그인ID 또는 소셜ID)
     * @param password 비밀번호 (시스템 로그인시만 필요)
     * @return MberVO 인증된 사용자 정보
     */
    MberVO authenticateUser(String lgnOffrType, String identifier, String password);

    /**
     * OAuth2 사용자 처리 (가입 또는 연동)
     * @param email 이메일
     * @param lgnOffrType 제공자 타입
     * @param snsLgnId 소셜 고유 ID
     * @param name 이름
     * @param request HTTP 요청 객체
     * @return MberVO 처리된 사용자 정보
     */
    MberVO processOAuth2User(String email, String lgnOffrType, String snsLgnId, String name, HttpServletRequest request);

    /**
     * 계정 연동
     * @param mbrId 회원 ID
     * @param lgnOffrType 제공자 타입
     * @param snsLgnId 소셜 ID (시스템일 경우 null)
     * @param lgnId 로그인 ID (소셜일 경우 null)
     * @param email 이메일
     * @param name 이름
     * @return boolean 연동 성공 여부
     */
    boolean linkAccount(String mbrId, String lgnOffrType, String snsLgnId, String lgnId, String email, String name);

    /**
     * 계정 연동 해지
     * @param mbrId 회원 ID
     * @param lgnOffrType 제공자 타입
     * @return boolean 해지 성공 여부
     */
    boolean unlinkAccount(String mbrId, String lgnOffrType);

    /**
     * 계정 재연동
     * @param mbrId 회원 ID
     * @param lgnOffrType 제공자 타입
     * @return boolean 재연동 성공 여부
     */
    boolean reLinkAccount(String mbrId, String lgnOffrType);

    /**
     * 연동된 계정 목록 조회
     * @param mbrId 회원 ID
     * @return List<MberSocialAccountVO> 연동된 계정 목록
     */
    List<MberSocialAccountVO> getLinkedAccounts(String mbrId, boolean searchAll);

    /**
     * 메인 프로필 설정
     * @param mbrId 회원 ID
     * @param lgnOffrType 제공자 타입
     * @return boolean 설정 성공 여부
     */
    boolean setPrimaryProfile(String mbrId, String lgnOffrType);

    /**
     * 계정 통합 제안
     * @param email 이메일
     * @param newProviderType 새로운 제공자 타입
     * @return HashMap<String, Object> 통합 제안 정보
     */
    HashMap<String, Object> suggestAccountMerge(String email, String newProviderType);

    /**
     * 제공자명을 회원타입으로 변환
     * @param provider 제공자명
     * @return String 변환된 제공자 명
     */
    String convertProviderToMbrType(String provider);
}