package com.kt.event.common.util;

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;

/**
 * 날짜/시간 유틸리티
 * 날짜와 시간 관련 공통 기능 제공
 */
public class DateTimeUtil {

    /**
     * 기본 날짜 시간 포맷터 (yyyy-MM-dd HH:mm:ss)
     */
    private static final DateTimeFormatter DEFAULT_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    /**
     * 날짜 포맷터 (yyyy-MM-dd)
     */
    private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");

    /**
     * 시간 포맷터 (HH:mm:ss)
     */
    private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm:ss");

    /**
     * 기본 타임존 (Asia/Seoul)
     */
    private static final ZoneId DEFAULT_ZONE = ZoneId.of("Asia/Seoul");

    /**
     * 현재 시간 조회 (Asia/Seoul 타임존)
     *
     * @return 현재 시간
     */
    public static LocalDateTime now() {
        return LocalDateTime.now(DEFAULT_ZONE);
    }

    /**
     * LocalDateTime을 기본 포맷 문자열로 변환
     *
     * @param dateTime LocalDateTime 객체
     * @return 포맷된 문자열 (yyyy-MM-dd HH:mm:ss)
     */
    public static String format(LocalDateTime dateTime) {
        if (dateTime == null) {
            return null;
        }
        return dateTime.format(DEFAULT_FORMATTER);
    }

    /**
     * LocalDateTime을 날짜 포맷 문자열로 변환
     *
     * @param dateTime LocalDateTime 객체
     * @return 포맷된 문자열 (yyyy-MM-dd)
     */
    public static String formatDate(LocalDateTime dateTime) {
        if (dateTime == null) {
            return null;
        }
        return dateTime.format(DATE_FORMATTER);
    }

    /**
     * LocalDateTime을 시간 포맷 문자열로 변환
     *
     * @param dateTime LocalDateTime 객체
     * @return 포맷된 문자열 (HH:mm:ss)
     */
    public static String formatTime(LocalDateTime dateTime) {
        if (dateTime == null) {
            return null;
        }
        return dateTime.format(TIME_FORMATTER);
    }

    /**
     * 문자열을 LocalDateTime으로 파싱
     *
     * @param dateTimeStr 날짜 시간 문자열 (yyyy-MM-dd HH:mm:ss)
     * @return LocalDateTime 객체
     */
    public static LocalDateTime parse(String dateTimeStr) {
        if (dateTimeStr == null || dateTimeStr.isEmpty()) {
            return null;
        }
        return LocalDateTime.parse(dateTimeStr, DEFAULT_FORMATTER);
    }

    /**
     * 두 날짜 사이의 차이 계산 (일 단위)
     *
     * @param start 시작 날짜
     * @param end   종료 날짜
     * @return 일수 차이
     */
    public static long daysBetween(LocalDateTime start, LocalDateTime end) {
        if (start == null || end == null) {
            return 0;
        }
        return java.time.Duration.between(start, end).toDays();
    }

    /**
     * 날짜가 특정 범위 내에 있는지 확인
     *
     * @param target 확인할 날짜
     * @param start  시작 날짜
     * @param end    종료 날짜
     * @return 범위 내 여부
     */
    public static boolean isBetween(LocalDateTime target, LocalDateTime start, LocalDateTime end) {
        if (target == null || start == null || end == null) {
            return false;
        }
        return !target.isBefore(start) && !target.isAfter(end);
    }

    /**
     * 날짜가 현재보다 이전인지 확인
     *
     * @param dateTime 확인할 날짜
     * @return 과거 날짜 여부
     */
    public static boolean isPast(LocalDateTime dateTime) {
        if (dateTime == null) {
            return false;
        }
        return dateTime.isBefore(now());
    }

    /**
     * 날짜가 현재보다 이후인지 확인
     *
     * @param dateTime 확인할 날짜
     * @return 미래 날짜 여부
     */
    public static boolean isFuture(LocalDateTime dateTime) {
        if (dateTime == null) {
            return false;
        }
        return dateTime.isAfter(now());
    }
}
