package com.unicorn.hgzero.common.util;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;

/**
 * 날짜/시간 유틸리티 클래스
 * 날짜와 시간 관련 공통 기능을 제공
 */
public class DateUtil {

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

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

    /**
     * ISO 8601 날짜시간 포맷 (yyyy-MM-dd'T'HH:mm:ss)
     */
    public static final DateTimeFormatter ISO_DATETIME_FORMATTER = DateTimeFormatter.ISO_LOCAL_DATE_TIME;

    private DateUtil() {
        // Utility class - prevent instantiation
    }

    /**
     * LocalDate를 문자열로 변환
     *
     * @param date 변환할 날짜
     * @return 포맷된 날짜 문자열 (yyyy-MM-dd)
     */
    public static String format(LocalDate date) {
        return date != null ? date.format(DATE_FORMATTER) : null;
    }

    /**
     * LocalDateTime을 문자열로 변환
     *
     * @param dateTime 변환할 날짜시간
     * @return 포맷된 날짜시간 문자열 (yyyy-MM-dd HH:mm:ss)
     */
    public static String format(LocalDateTime dateTime) {
        return dateTime != null ? dateTime.format(DATETIME_FORMATTER) : null;
    }

    /**
     * LocalDateTime을 커스텀 포맷으로 변환
     *
     * @param dateTime 변환할 날짜시간
     * @param formatter 날짜시간 포맷터
     * @return 포맷된 날짜시간 문자열
     */
    public static String format(LocalDateTime dateTime, DateTimeFormatter formatter) {
        return dateTime != null ? dateTime.format(formatter) : null;
    }

    /**
     * 문자열을 LocalDate로 변환
     *
     * @param dateString 날짜 문자열 (yyyy-MM-dd)
     * @return LocalDate 객체
     */
    public static LocalDate parseDate(String dateString) {
        return dateString != null ? LocalDate.parse(dateString, DATE_FORMATTER) : null;
    }

    /**
     * 문자열을 LocalDateTime으로 변환
     *
     * @param dateTimeString 날짜시간 문자열 (yyyy-MM-dd HH:mm:ss)
     * @return LocalDateTime 객체
     */
    public static LocalDateTime parseDateTime(String dateTimeString) {
        return dateTimeString != null ? LocalDateTime.parse(dateTimeString, DATETIME_FORMATTER) : null;
    }

    /**
     * 두 날짜 사이의 일수 계산
     *
     * @param startDate 시작 날짜
     * @param endDate 종료 날짜
     * @return 일수 차이
     */
    public static long daysBetween(LocalDate startDate, LocalDate endDate) {
        return ChronoUnit.DAYS.between(startDate, endDate);
    }

    /**
     * 두 날짜시간 사이의 시간 계산 (시간 단위)
     *
     * @param startDateTime 시작 날짜시간
     * @param endDateTime 종료 날짜시간
     * @return 시간 차이
     */
    public static long hoursBetween(LocalDateTime startDateTime, LocalDateTime endDateTime) {
        return ChronoUnit.HOURS.between(startDateTime, endDateTime);
    }

    /**
     * 두 날짜시간 사이의 시간 계산 (분 단위)
     *
     * @param startDateTime 시작 날짜시간
     * @param endDateTime 종료 날짜시간
     * @return 분 차이
     */
    public static long minutesBetween(LocalDateTime startDateTime, LocalDateTime endDateTime) {
        return ChronoUnit.MINUTES.between(startDateTime, endDateTime);
    }

    /**
     * 현재 날짜 반환
     *
     * @return 현재 날짜
     */
    public static LocalDate now() {
        return LocalDate.now();
    }

    /**
     * 현재 날짜시간 반환
     *
     * @return 현재 날짜시간
     */
    public static LocalDateTime nowDateTime() {
        return LocalDateTime.now();
    }
}
