package incheon.com.cmm.popup;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 팝업 공지 표시 공통 헬퍼
 * - 쿠키 기반 숨김 처리된 팝업 필터링
 * - 범용 시스템 코드 지원 (AGS, SGP 등)
 */
@Slf4j
@Component
public class PopupNtcHelper {

    private static final String POPUP_HIDE_COOKIE_PREFIX = "popup_hide_";
    private static final String POPUP_HIDE_VALUE = "Y";

    /**
     * 표시할 팝업 공지 목록 조회 (쿠키로 숨김 처리된 팝업 제외)
     *
     * @param request   HttpServletRequest
     * @param allPopups 전체 팝업 목록 (서비스에서 조회한 결과)
     * @return 표시할 팝업 목록
     */
    public List<Map<String, Object>> getVisiblePopupList(HttpServletRequest request,
                                                          List<Map<String, Object>> allPopups) {
        if (allPopups == null || allPopups.isEmpty()) {
            return Collections.emptyList();
        }

        // 쿠키에서 숨김 처리된 팝업 ID 목록 추출
        List<String> hiddenPopupIds = getHiddenPopupIds(request);

        if (hiddenPopupIds.isEmpty()) {
            return allPopups;
        }

        // 숨김 처리된 팝업 필터링
        return allPopups.stream()
                .filter(popup -> !isPopupHidden(popup, hiddenPopupIds))
                .collect(Collectors.toList());
    }

    /**
     * 쿠키에서 숨김 처리된 팝업 ID 목록 추출
     *
     * @param request HttpServletRequest
     * @return 숨김 처리된 팝업 ID 목록
     */
    public List<String> getHiddenPopupIds(HttpServletRequest request) {
        Cookie[] cookies = request.getCookies();
        if (cookies == null) {
            return Collections.emptyList();
        }

        return Arrays.stream(cookies)
                .filter(c -> c.getName().startsWith(POPUP_HIDE_COOKIE_PREFIX)
                        && POPUP_HIDE_VALUE.equals(c.getValue()))
                .map(c -> c.getName().replace(POPUP_HIDE_COOKIE_PREFIX, ""))
                .collect(Collectors.toList());
    }

    /**
     * 특정 팝업이 숨김 처리되었는지 확인
     *
     * @param popup          팝업 정보
     * @param hiddenPopupIds 숨김 처리된 팝업 ID 목록
     * @return 숨김 여부
     */
    private boolean isPopupHidden(Map<String, Object> popup, List<String> hiddenPopupIds) {
        Object snObj = popup.get("popupNtcSn");
        String sn = snObj != null ? String.valueOf(snObj) : "";
        return hiddenPopupIds.contains(sn);
    }

    /**
     * 팝업 숨김 쿠키 이름 생성
     *
     * @param popupNtcSn 팝업 공지 일련번호
     * @return 쿠키 이름
     */
    public static String getHideCookieName(Long popupNtcSn) {
        return POPUP_HIDE_COOKIE_PREFIX + popupNtcSn;
    }

    /**
     * 팝업 숨김 쿠키 값
     */
    public static String getHideCookieValue() {
        return POPUP_HIDE_VALUE;
    }
}
