package jnpf.model.attendance.vo.attendance;

import cn.hutool.core.date.DateUtil;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Date;

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class OutOrBusApproveVo {
    /**
     * 类型1.外出 2.出差
     */
    private Integer type;
    /**
     * 外出或出差审批表ID
     */
    private String id;
    /**
     * 开始时间
     */
    private Date startTime;
    /**
     * 结束时间
     */
    private Date endTime;
    /**
     * 单位 1.小时 2.天
     */
    private Integer unit;
    /**
     * 时长
     */
    private BigDecimal dayNum;

    /**
     * 计算指定日期内的有效时长
     * @param targetDate 指定日期
     * @param isDays true返回天数，false返回小时数
     * @return 该日期内的有效时长
     */
    public BigDecimal getDurationForDate(Date targetDate, boolean isDays) {
        if (startTime == null || endTime == null || targetDate == null) {
            return BigDecimal.ZERO;
        }
        // 获取目标日期的开始和结束时间
        Date targetStart = DateUtil.beginOfDay(targetDate);
        Date targetEnd = DateUtil.endOfDay(targetDate);
        // 计算交集时间段
        Date actualStart = startTime.after(targetStart) ? startTime : targetStart;
        Date actualEnd = endTime.before(targetEnd) ? endTime : targetEnd;
        // 如果没有交集，返回0
        if (actualStart.after(actualEnd)) {
            return BigDecimal.ZERO;
        }
        // 计算时长
        long diffMillis = actualEnd.getTime() - actualStart.getTime();
        if (isDays) {
            // 返回天数
            return new BigDecimal(diffMillis).divide(new BigDecimal(86400000), 2, RoundingMode.HALF_UP);
        } else {
            // 返回小时数
            return new BigDecimal(diffMillis).divide(new BigDecimal(3600000), 2, RoundingMode.HALF_UP);
        }
    }
}
