<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="dateUtil" uri="http://egovframework.go.kr/functions/date-util" %>
<%@ taglib prefix="path" uri="http://egovframework.go.kr/functions/path" %>

<%-- XssUtil 인스턴스 생성 --%>
<jsp:useBean id="xssUtil" class="egovframework.filter.XssUtil" scope="request" />

<%-- 현재 URL 경로 가져오기 --%>
<c:set var="currentUrl" value="${requestScope['javax.servlet.forward.servlet_path']}" />
<!-- 디버깅: 현재 URL = ${currentUrl} -->


<!-- Main header -->
<div class="main-header">
    <!-- 로고 영역 -->
    <div class="header-logo">
        <a href="<c:url value="/"/>" class="logo">
            <img src="<c:url value="/img/xit-logo/logo_si.png"/>" alt="Logo" id="main-logo"/>
        </a>
    </div>

    <%--  상단 메뉴와 서브메뉴 드롭다운 표출  --%>
    <c:if test="${not empty sessionScope.sessionVO.menus}">
        <div class="top-level-menu">
            <c:forEach var="menu" items="${sessionScope.sessionVO.menus}">
                <c:if test="${menu.useYn eq 'Y' and menu.viewYn eq 'Y'}">
                    <c:set var="firstChildUrl" value="#" />
                    <c:set var="hasValidChild" value="false" />
                    <c:set var="allUrlPatterns" value="${not empty menu.urlPattern ? xssUtil.unescape(menu.urlPattern) : ''}" />
                    <c:set var="isMenuActive" value="false" />
                    
                    <%-- 메뉴 자체에 유효한 URL이 있는 경우 우선 적용 --%>
                    <c:if test="${not empty menu.menuUrl and menu.menuUrl != '#'}">
                        <c:set var="firstChildUrl" value="${xssUtil.unescape(menu.menuUrl)}" />
                        <c:set var="hasValidChild" value="true" />
                        
                        <%-- 메뉴 자체의 URL을 URL 패턴으로 변환하여 추가 --%>
                        <c:set var="menuUrlAsPattern" value="${xssUtil.unescape(menu.menuUrl)}/**" />
                        <c:set var="allUrlPatterns" value="${allUrlPatterns}${not empty allUrlPatterns ? ',' : ''}${menuUrlAsPattern}" />
                    </c:if>
            
                    <%-- 메뉴 자체에 URL이 없는 경우 첫 번째 유효한 하위 URL 찾기 --%>
                    <%-- 동시에 모든 하위 메뉴의 URL 패턴을 수집 --%>
                    <c:if test="${not empty menu.children}">
                        <c:forEach var="subMenu" items="${menu.children}" varStatus="subStatus">
                            <%-- 유효한 하위 URL 찾기 --%>
                            <c:if test="${subMenu.useYn eq 'Y' and subMenu.viewYn eq 'Y' and not empty subMenu.menuUrl and subMenu.menuUrl != '#' and not hasValidChild}">
                                <c:set var="firstChildUrl" value="${xssUtil.unescape(subMenu.menuUrl)}" />
                                <c:set var="hasValidChild" value="true" />
                            </c:if>
                            
                            <%-- 하위 메뉴의 URL 패턴 수집 --%>
                            <c:if test="${not empty subMenu.urlPattern}">
                                <c:set var="allUrlPatterns" value="${allUrlPatterns}${not empty allUrlPatterns ? ',' : ''}${xssUtil.unescape(subMenu.urlPattern)}" />
                            </c:if>
                        </c:forEach>
                    </c:if>
                    
                    <%-- 메뉴 활성화 상태 확인 --%>
                    <%-- 1. 현재 URL이 메뉴 URL로 시작하는 경우 활성화 --%>
                    <c:if test="${not empty firstChildUrl and firstChildUrl != '#' and fn:startsWith(currentUrl, firstChildUrl)}">
                        <c:set var="isMenuActive" value="true" />
                    </c:if>
                    
                    <%-- 2. 메뉴의 URL 패턴과 현재 URL 비교 --%>
                    <c:if test="${not empty allUrlPatterns and not isMenuActive}">
                        <c:set var="patterns" value="${fn:split(allUrlPatterns, ',')}" />
                        <c:forEach var="pattern" items="${patterns}" varStatus="patternStatus">
                            <c:set var="trimmedPattern" value="${fn:trim(pattern)}" />
                            
                            <c:if test="${not empty trimmedPattern}">
                                <c:set var="isMatch" value="${path:match(trimmedPattern, currentUrl)}" />
                                
                                <c:if test="${isMatch}">
                                    <c:set var="isMenuActive" value="true" />
                                </c:if>
                            </c:if>
                        </c:forEach>
                    </c:if>
            
                    <%-- 메인 메뉴 항목 (드롭다운이 있는 경우와 없는 경우 구분) --%>
                    <div class="top-menu-dropdown ${isMenuActive ? 'active' : ''}" data-menu-id="${menu.menuId}">
                        <a href="<c:url value='${firstChildUrl}' />" class="top-menu-item ${isMenuActive ? 'active' : ''}" title="${menu.menuNm}">
                            <c:if test="${not empty menu.menuIcon}"><i data-feather="${menu.menuIcon}" class="top-menu-icon"></i></c:if>
                            <span>${menu.menuNm}</span>
                            <c:if test="${not empty menu.children}">
                                <i class="material-icons dropdown-arrow">keyboard_arrow_down</i>
                            </c:if>
                        </a>
                        
                        <%-- 서브메뉴 드롭다운 --%>
                        <c:if test="${not empty menu.children}">
                            <div class="top-menu-submenu">
                                <c:forEach var="subMenu" items="${menu.children}">
                                    <c:if test="${subMenu.useYn eq 'Y' and subMenu.viewYn eq 'Y'}">
                                        <c:set var="subMenuUrl" value="${not empty subMenu.menuUrl ? xssUtil.unescape(subMenu.menuUrl) : '#'}" />
                                        <c:set var="subMenuUrlPattern" value="${not empty subMenu.urlPattern ? xssUtil.unescape(subMenu.urlPattern) : ''}" />
                                        <c:set var="isSubMenuActive" value="false" />
                                        
                                        <%-- 서브메뉴 활성화 상태 확인 --%>
                                        <%-- 1. 현재 URL이 서브메뉴 URL로 시작하는 경우 --%>
                                        <c:if test="${not empty subMenuUrl and subMenuUrl != '#' and fn:startsWith(currentUrl, subMenuUrl)}">
                                            <c:set var="isSubMenuActive" value="true" />
                                        </c:if>
                                        
                                        <%-- 2. 서브메뉴의 URL 패턴과 현재 URL 비교 --%>
                                        <c:if test="${not empty subMenuUrlPattern and not isSubMenuActive}">
                                            <c:set var="subPatterns" value="${fn:split(subMenuUrlPattern, ',')}" />
                                            <c:forEach var="subPattern" items="${subPatterns}">
                                                <c:set var="trimmedSubPattern" value="${fn:trim(subPattern)}" />
                                                <c:if test="${not empty trimmedSubPattern}">
                                                    <c:set var="isSubMatch" value="${path:match(trimmedSubPattern, currentUrl)}" />
                                                    <c:if test="${isSubMatch}">
                                                        <c:set var="isSubMenuActive" value="true" />
                                                    </c:if>
                                                </c:if>
                                            </c:forEach>
                                        </c:if>
                                        
                                        <a href="<c:url value='${subMenuUrl}' />" class="submenu-item ${isSubMenuActive ? 'active' : ''}" title="${subMenu.menuNm}">
                                            ${subMenu.menuNm}
                                        </a>
                                    </c:if>
                                </c:forEach>
                            </div>
                        </c:if>
                    </div>
                </c:if>
            </c:forEach>
        </div>
    </c:if>

    <!-- 우측 메뉴 영역 -->
    <ul class="nav nav-circle ml-auto">

        <!-- 세션 종료 시간 표시 -->
        <li class="nav-item d-none d-sm-block ml-2">
            <label class="h_date" title="세션 종료 예정시간">세션 종료: <span id="sessionExpiryTime">${dateUtil:getSessionExpiryTime(pageContext.request, 'HH:mm:ss')}</span></label>
        </li>
        <!-- 사용자 프로필 드롭다운 -->
        <li class="nav-item dropdown ml-2" style="display: flex; align-items: center;">
            <a class="nav-link nav-link-faded rounded nav-link-img dropdown-toggle px-2" href="#" 
               data-display="static">
                <span class="d-none d-sm-block">${sessionScope.sessionVO.user.userNm}</span>
            </a>
            <div class="dropdown-menu dropdown-menu-right pt-0 overflow-hidden" style="min-width: 220px;">
                <!-- 사용자 정보 헤더 -->
                <div class="media align-items-center bg-primary text-white px-4 py-3 mb-2">
                    <div class="media-body text-nowrap">
                        <h6 class="mb-0">${sessionScope.sessionVO.user.userNm}</h6>
                        <span class="text-gray-400 font-size-sm">${sessionScope.sessionVO.user.userAcnt}</span>
                    </div>
                </div>
                <!-- 드롭다운 메뉴 항목 -->
                <a class="dropdown-item has-icon" href="javascript:void(0)" id="mypageBtn">
                    <i class="mr-2" data-feather="user"></i>마이페이지
                </a>
                <a class="dropdown-item has-icon text-danger" href="javascript:void(0)" id="logoutBtn">
                    <i class="mr-2" data-feather="log-out"></i>로그 아웃
                </a>
            </div>
        </li>
    </ul>
</div>
<!-- /Main header -->

<script type="text/javascript">
/**
 * 메인 헤더 JavaScript 기능
 *
 **/
$(document).ready(function() {
    // 드롭다운 메뉴 초기화
    initializeDropdowns();

    // 이벤트 리스너 등록
    registerEventListeners();

    // 세션 타이머 초기화
    initSessionTimer();
    
    // Feather 아이콘 초기화 (모든 data-feather 속성을 가진 아이콘에 적용)
    initializeFeatherIcons();

    // 상단 메뉴 드롭다운 이벤트 처리
    $('.top-menu-dropdown').hover(
        function() {
            // 마우스 오버 시 서브메뉴 표시
            $(this).find('.top-menu-submenu').fadeIn(200);
        },
        function() {
            // 마우스 아웃 시 서브메뉴 숨김
            $(this).find('.top-menu-submenu').fadeOut(200);
        }
    );


    /**
     * Feather 아이콘 초기화 함수
     * 모든 data-feather 속성을 가진 요소를 feather 아이콘으로 변환합니다.
     */
    function initializeFeatherIcons() {
        // feather 라이브러리가 로드되었는지 확인
        if (typeof feather === 'undefined') {
            console.log('[DEBUG_LOG] Feather 라이브러리가 로드되지 않았습니다.');
            return;
        }

        try {

            var $featherElements = $('[data-feather]');
            //console.log('[DEBUG_LOG] 발견된 feather 아이콘 요소 수:', $featherElements.length);

            if ($featherElements.length > 0) {
                // 모든 data-feather 속성을 가진 요소에 아이콘 적용
                feather.replace();
                //console.log('[DEBUG_LOG] Feather 아이콘 초기화 완료');
            } else {
                console.log('[DEBUG_LOG] feather 아이콘 요소를 찾을 수 없습니다.');
            }

            /*
            // DOM이 준비될 때까지 잠시 기다린 후 실행
            setTimeout(function() {
                var $featherElements = $('[data-feather]');
                console.log('[DEBUG_LOG] 발견된 feather 아이콘 요소 수:', $featherElements.length);

                if ($featherElements.length > 0) {
                    // 모든 data-feather 속성을 가진 요소에 아이콘 적용
                    feather.replace();
                    console.log('[DEBUG_LOG] Feather 아이콘 초기화 완료');
                } else {
                    console.log('[DEBUG_LOG] feather 아이콘 요소를 찾을 수 없습니다.');
                }
            }, 30);
            */
        } catch (error) {
            console.error('[DEBUG_LOG] Feather 아이콘 초기화 오류:', error);
        }
    }

    /**
     * 드롭다운 메뉴 초기화 함수
     */
    function initializeDropdowns() {
        // 사용자 프로필 드롭다운 설정
        $(".nav-item.dropdown.ml-2 .dropdown-toggle").attr("data-toggle", "dropdown");

        // 드롭다운 초기화 (Popper.js 사용)
        $('.dropdown-toggle').dropdown({
            boundary: 'window' // DataTables와의 충돌 방지를 위한 설정
        });
    }

    /**
     * 이벤트 리스너 등록 함수
     */
    function registerEventListeners() {
        // 사용자 메뉴 이벤트
        $("#logoutBtn").on("click", handleLogout);
        $("#mypageBtn").on("click", handleMypage);
    }

    /**
     * 로그아웃 버튼 클릭 이벤트 핸들러
     * @param {Event} e - 이벤트 객체
     */
    function handleLogout(e) {
        e.preventDefault(); // 기본 이벤트 방지

        // AJAX 요청으로 로그아웃 처리
        $.ajax({
            url: "<c:url value='/login/logout.ajax'/>",
            type: "POST",
            dataType: "json",
            success: function(response) {
                if (response.result) {
                    alert(response.message); // 로그아웃 성공 메시지 표시
                    location.href = response.data.redirectUrl; // 로그인 페이지로 이동
                } else {
                    alert(response.message); // 오류 메시지 표시
                }
            },
            error: function(xhr, status, error) {
                // 에러 처리는 xit-common.js의 ajaxError에서 처리됨
            }
        });
    }

    /**
     * 마이페이지 버튼 클릭 이벤트 핸들러
     * @param {Event} e - 이벤트 객체
     */
    function handleMypage(e) {
        e.preventDefault(); // 기본 이벤트 방지
        location.href = "<c:url value='/mypage.do' />";
    }



    /**
     * 세션 타이머 초기화 함수
     * 세션 종료 시간을 매초 업데이트 (절전모드 대응)
     */
    function initSessionTimer() {
        // 초기 세션 시간 가져오기 (HH:mm:ss 형식)
        var $sessionTimeElement = $("#sessionExpiryTime");
        var initialTime = $sessionTimeElement.text();

        // 시간 문자열을 초로 변환하는 함수
        function timeToSeconds(timeStr) {
            var parts = timeStr.split(':');
            return parseInt(parts[0]) * 3600 + parseInt(parts[1]) * 60 + parseInt(parts[2]);
        }

        // 초를 HH:mm:ss 형식으로 변환하는 함수
        function secondsToTime(seconds) {
            var hours = Math.floor(seconds / 3600);
            var minutes = Math.floor((seconds % 3600) / 60);
            var secs = seconds % 60;

            return String(hours).padStart(2, '0') + ':' +
                String(minutes).padStart(2, '0') + ':' +
                String(secs).padStart(2, '0');
        }

        // 초기 시간을 초로 변환
        var totalSeconds = timeToSeconds(initialTime);

        // 절전모드 대응을 위한 시작 시간 기록 (절대 시간)
        var startTime = Date.now();

        // 1초마다 시간 업데이트
        var timerInterval = setInterval(function() {
            // 현재 시간 가져오기
            var now = Date.now();

            // 경과 시간 계산 (밀리초 -> 초)
            var elapsed = Math.floor((now - startTime) / 1000);

            // 남은 시간 계산
            var remainingSeconds = totalSeconds - elapsed;

            // 남은 시간이 0 이하면 타이머 중지
            if (remainingSeconds <= 0) {
                clearInterval(timerInterval);
                $sessionTimeElement.text("00:00:00");

                // 세션 만료 알림 표시
                // 자동 세션종료는 중지, 불편함
                //alert("세션이 만료되었습니다. 다시 로그인해주세요.");
                //location.href = loginUrl;
                return;
            }

            // 화면에 남은 시간 표시
            $sessionTimeElement.text(secondsToTime(remainingSeconds));
        }, 1000);
    }
});
</script>
