package com.engine.matfron.util;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.YearMonth;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;

/**
 * @Author liang.cheng
 * @Date 2023/9/27 4:44 PM
 * @Description:
 * @Version 1.0
 */

@Slf4j
public class CommonDateUtil {

    public static final String DATE_FORMATTER_PATTERN = "yyyy-MM-dd";

    /**
     * YearMonth转Date
     * 注意dayOfMonth范围：1到31之间，最大值根据月份确定特殊情况，如2月闰年29，非闰年28
     * 如果要转换为当月最后一天，可以使用下面方法：toDateEndOfMonth(YearMonth)
     *
     * @param yearMonth
     * @param dayOfMonth
     * @return
     */
    public static Date toDate(YearMonth yearMonth, int dayOfMonth) {
        Objects.requireNonNull(yearMonth, "yearMonth");
        return localDateToDate(yearMonth.atDay(dayOfMonth));
    }


    /**
     * YearMonth转Date，转换为当月第一天
     *
     * @param yearMonth
     * @return
     */
    public static Date toDateStartOfMonth(YearMonth yearMonth) {
        return toDate(yearMonth, 1);
    }

    /**
     * YearMonth转Date，转换为当月最后一天
     *
     * @param yearMonth
     * @return
     */
    public static Date toDateEndOfMonth(YearMonth yearMonth) {
        Objects.requireNonNull(yearMonth, "yearMonth");
        return localDateToDate(yearMonth.atEndOfMonth());
    }

    public static Date localDateToDate(LocalDate localDate) {
        if (null == localDate) {
            return null;
        }
        ZonedDateTime zonedDateTime = localDate.atStartOfDay(ZoneId.systemDefault());
        return Date.from(zonedDateTime.toInstant());
    }

    public static String getFormatYear(Date localDate) {
        if (localDate == null) {
            return StringUtils.EMPTY;
        }
        try {
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DATE_FORMATTER_PATTERN);
            return simpleDateFormat.format(localDate);
        } catch (Exception e) {
            log.warn("格式化年份错误", e);
            return StringUtils.EMPTY;
        }
    }

    public static List<YearMonth> getYearMonths(LocalDate date) {
        List<YearMonth> yearMonths = new ArrayList<>();
        for (int month = 1; month <= 12; month++) {
            LocalDate firstDayOfMonth = date.withMonth(month);
            yearMonths.add(YearMonth.from(firstDayOfMonth));
        }
        return yearMonths;
    }

}
