package com.fuyuanshen.common.core.utils.date;

import java.util.Date;
import java.util.concurrent.TimeUnit;

/**
 * 持续时间工具类
 * 提供计算两个日期之间差值的方法，并以时分秒格式返回
 *
 * @author fys
 */
public class DurationUtils {

    /**
     * 计算两个日期之间的差值，返回时分秒格式的字符串
     * 格式为 "X小时 Y分钟 Z秒"
     *
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 时分秒格式的时间差字符串
     */
    public static String getDurationBetween(Date startDate, Date endDate) {
        if (startDate == null || endDate == null) {
            return "0小时 0分钟 0秒";
        }

        long diffInMillis = Math.abs(endDate.getTime() - startDate.getTime());
        long hours = TimeUnit.MILLISECONDS.toHours(diffInMillis);
        long minutes = TimeUnit.MILLISECONDS.toMinutes(diffInMillis) % 60;
        long seconds = TimeUnit.MILLISECONDS.toSeconds(diffInMillis) % 60;

        return String.format("%d小时 %d分钟 %d秒", hours, minutes, seconds);
    }

    /**
     * 计算两个日期之间的差值，返回时分秒格式的字符串
     * 仅显示非零单位
     *
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 时分秒格式的时间差字符串，仅显示非零单位
     */
    public static String getDurationBetweenPretty(Date startDate, Date endDate) {
        if (startDate == null || endDate == null) {
            return "0秒";
        }

        long diffInMillis = Math.abs(endDate.getTime() - startDate.getTime());
        long hours = TimeUnit.MILLISECONDS.toHours(diffInMillis);
        long minutes = TimeUnit.MILLISECONDS.toMinutes(diffInMillis) % 60;
        long seconds = TimeUnit.MILLISECONDS.toSeconds(diffInMillis) % 60;

        StringBuilder result = new StringBuilder();
        if (hours > 0) {
            result.append(hours).append("小时 ");
        }
        if (minutes > 0) {
            result.append(minutes).append("分钟 ");
        }
        if (seconds > 0 || result.length() == 0) {
            result.append(seconds).append("秒");
        }

        return result.toString().trim();
    }

    /**
     * 计算指定毫秒数的持续时间，返回时分秒格式的字符串
     *
     * @param millis 毫秒数
     * @return 时分秒格式的持续时间字符串
     */
    public static String getDurationFromMillis(long millis) {
        long absMillis = Math.abs(millis);
        long hours = TimeUnit.MILLISECONDS.toHours(absMillis);
        long minutes = TimeUnit.MILLISECONDS.toMinutes(absMillis) % 60;
        long seconds = TimeUnit.MILLISECONDS.toSeconds(absMillis) % 60;

        return String.format("%d小时 %d分钟 %d秒", hours, minutes, seconds);
    }

    /**
     * 计算指定毫秒数的持续时间，返回时分秒格式的字符串
     * 仅显示非零单位
     *
     * @param millis 毫秒数
     * @return 时分秒格式的持续时间字符串，仅显示非零单位
     */
    public static String getDurationFromMillisPretty(long millis) {
        long absMillis = Math.abs(millis);
        long hours = TimeUnit.MILLISECONDS.toHours(absMillis);
        long minutes = TimeUnit.MILLISECONDS.toMinutes(absMillis) % 60;
        long seconds = TimeUnit.MILLISECONDS.toSeconds(absMillis) % 60;

        StringBuilder result = new StringBuilder();
        if (hours > 0) {
            result.append(hours).append("小时 ");
        }
        if (minutes > 0) {
            result.append(minutes).append("分钟 ");
        }
        if (seconds > 0 || result.length() == 0) {
            result.append(seconds).append("秒");
        }

        return result.toString().trim();
    }
}