/**
 * 날짜 관련 유틸리티 함수들
 * 한국 표준시(KST) 기준으로 처리
 */

const DateUtils = {
    /**
     * UTC 시간을 KST로 변환
     * @param {string|Date} dateInput - UTC 날짜 문자열 또는 Date 객체
     * @returns {Date} KST 시간대의 Date 객체
     */
    toKST(dateInput) {
        const date = typeof dateInput === 'string' ? new Date(dateInput) : dateInput;
        // UTC 시간에 9시간 추가 (KST = UTC+9)
        return new Date(date.getTime() + (date.getTimezoneOffset() * 60000) + (9 * 3600000));
    },
    
    /**
     * 현재 KST 시간 가져오기
     * @returns {Date} 현재 KST 시간
     */
    nowKST() {
        const now = new Date();
        return this.toKST(now);
    },
    
    /**
     * KST 날짜를 한국식 문자열로 포맷
     * @param {string|Date} dateInput - 날짜
     * @param {boolean} includeTime - 시간 포함 여부
     * @returns {string} 포맷된 날짜 문자열
     */
    formatKST(dateInput, includeTime = false) {
        const date = typeof dateInput === 'string' ? new Date(dateInput) : dateInput;
        
        const options = {
            year: 'numeric',
            month: '2-digit',
            day: '2-digit',
            timeZone: 'Asia/Seoul'
        };
        
        if (includeTime) {
            options.hour = '2-digit';
            options.minute = '2-digit';
            options.hour12 = false;
        }
        
        return date.toLocaleString('ko-KR', options);
    },
    
    /**
     * 상대적 시간 표시 (예: 3분 전, 2시간 전)
     * @param {string|Date} dateInput - 날짜
     * @returns {string} 상대적 시간 문자열
     */
    getRelativeTime(dateInput) {
        const date = typeof dateInput === 'string' ? new Date(dateInput) : dateInput;
        const now = new Date();
        const diffMs = now - date;
        const diffSec = Math.floor(diffMs / 1000);
        const diffMin = Math.floor(diffSec / 60);
        const diffHour = Math.floor(diffMin / 60);
        const diffDay = Math.floor(diffHour / 24);
        
        if (diffSec < 60) return '방금 전';
        if (diffMin < 60) return `${diffMin}분 전`;
        if (diffHour < 24) return `${diffHour}시간 전`;
        if (diffDay < 7) return `${diffDay}일 전`;
        
        return this.formatKST(date);
    },
    
    /**
     * 오늘 날짜인지 확인 (KST 기준)
     * @param {string|Date} dateInput - 날짜
     * @returns {boolean}
     */
    isToday(dateInput) {
        const date = typeof dateInput === 'string' ? new Date(dateInput) : dateInput;
        const today = new Date();
        
        return date.toLocaleDateString('ko-KR', { timeZone: 'Asia/Seoul' }) === 
               today.toLocaleDateString('ko-KR', { timeZone: 'Asia/Seoul' });
    },
    
    /**
     * 이번 주인지 확인 (KST 기준, 월요일 시작)
     * @param {string|Date} dateInput - 날짜
     * @returns {boolean}
     */
    isThisWeek(dateInput) {
        const date = typeof dateInput === 'string' ? new Date(dateInput) : dateInput;
        const now = new Date();
        
        // 주의 시작일 (월요일) 계산
        const startOfWeek = new Date(now);
        const day = startOfWeek.getDay();
        const diff = startOfWeek.getDate() - day + (day === 0 ? -6 : 1);
        startOfWeek.setDate(diff);
        startOfWeek.setHours(0, 0, 0, 0);
        
        // 주의 끝일 (일요일) 계산
        const endOfWeek = new Date(startOfWeek);
        endOfWeek.setDate(startOfWeek.getDate() + 6);
        endOfWeek.setHours(23, 59, 59, 999);
        
        return date >= startOfWeek && date <= endOfWeek;
    },
    
    /**
     * ISO 문자열을 로컬 date input 값으로 변환
     * @param {string} isoString - ISO 날짜 문자열
     * @returns {string} YYYY-MM-DD 형식
     */
    toDateInputValue(isoString) {
        const date = new Date(isoString);
        const year = date.getFullYear();
        const month = String(date.getMonth() + 1).padStart(2, '0');
        const day = String(date.getDate()).padStart(2, '0');
        return `${year}-${month}-${day}`;
    },
    
    /**
     * 날짜 차이 계산 (일 단위)
     * @param {string|Date} date1 - 첫 번째 날짜
     * @param {string|Date} date2 - 두 번째 날짜
     * @returns {number} 일 수 차이
     */
    getDaysDiff(date1, date2) {
        const d1 = typeof date1 === 'string' ? new Date(date1) : date1;
        const d2 = typeof date2 === 'string' ? new Date(date2) : date2;
        const diffMs = Math.abs(d2 - d1);
        return Math.floor(diffMs / (1000 * 60 * 60 * 24));
    }
};

// 전역으로 사용 가능하도록 export
window.DateUtils = DateUtils;
