package com.takensoft.common.util;

import jakarta.servlet.http.HttpSession;
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Component;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @author  : takensoft
 * @since   : 2025.03.21
 * @modification
 *     since    |    author    | description
 *  2025.03.21  |  takensoft   | 최초 등록
 *
 * 세션 로그인 방식의 유틸리티
 */
@Component
public class SessionUtil {

        private final Map<String, HttpSession> sessionMap = new ConcurrentHashMap<>();

    /**
     * @param mbrId - 사용자 Id
     * @param newSession - HTTP 세션
     *
     * 기존 세션 있으면 강제 로그아웃
     */
        public synchronized void registerSession(String mbrId, HttpSession newSession) {
            HttpSession oldSession = sessionMap.get(mbrId);
            if (oldSession != null && oldSession != newSession) {
                oldSession.invalidate();
            }
            sessionMap.put(mbrId, newSession);
        }
    /**
     * @param mbrId - 사용자 Id
     *
     * 로그아웃
     */
        public void removeSession(String mbrId) {
            HttpSession session = sessionMap.get(mbrId);
            if (session != null) {
                session.invalidate();  // 세션 무효화
            }
            sessionMap.remove(mbrId); // 이후 맵에서 제거
        }

    /**
     *
     * 전체 로그아웃
     */
        public void invalidateAllSessions() {
            for (HttpSession session : sessionMap.values()) {
                if (session != null) {
                    session.invalidate();
                }
            }
            sessionMap.clear(); // 전체 초기화
        }

}
