package jnpf.model.attendance.vo;

import jnpf.entity.attendance.AttendanceShiftSettingPeriodEntity;
import jnpf.util.DateDetail;
import jnpf.util.StringUtil;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.Objects;

/**
 * <p>
 * 考勤组-考勤配置-时段
 * </p>
 *
 * @author ahua
 * @since 2023-11-22
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class AttendanceShiftSettingPeriodVo implements Serializable {

    private static final long serialVersionUID = 1L;

    private String id;
    /**
     * 班制类型（1固定班 2排班）
     */
    private Integer systemType;
    /**
     * 类型：1 上半天 2 下半天 （半天制班次使用）
     */
    private Integer type;
    /**
     * 时段工时(天 保留一位小数)
     */
    private BigDecimal timeSlotDay;
    /**
     * 计薪工时(小时 保留4位小数)
     */
    private BigDecimal payrollHours;
    /**
     * 允许迟到(0否 1是)
     */
    private Integer lateEnable;
    /**
     * 允许早退(0否 1是)
     */
    private Integer earlyEnable;
    /**
     * 允许休息時間(0否 1是)
     */
    private Integer breakEnable;
    /**
     * 允许次日下班(0否 1是)
     */
    private Integer nextDayEnable;
    /**
     * 打卡开始时间点
     */
    private String clockStartPoint;
    /**
     * 打卡开始时间点 当日还是次日，1当日 2次日
     */
    private Integer clockStartPointType;
    /**
     * 上班时间点
     */
    private String inPoint;
    /**
     * 迟到时间点
     */
    private String latePoint;
    /**
     * 迟到当日还是次日，1当日 2次日
     */
    private Integer lateType;
    /**
     * 上班缺卡时间点
     */
    private String inLackPoint;
    /**
     * 上班缺卡 当日还是次日，1当日 2次日
     */
    private Integer inLackPointType;
    /**
     * 休息开始当日还是次日，1当日 2次日
     */
    private Integer breakStartType;
    /**
     * 休息开始时间点
     */
    private String breakStartPoint;
    /**
     * 休息结束当日还是次日，1当日 2次日
     */
    private Integer breakEndType;
    /**
     * 休息结束时间点
     */
    private String breakEndPoint;
    /**
     * 早退当日还是次日，1当日 2次日
     */
    private Integer earlyType;
    /**
     * 早退时间点
     */
    private String earlyPoint;
    /**
     * 上班当日还是次日，1当日 2次日
     */
    private Integer inType;
    /**
     * 下班当日还是次日，1当日 2次日
     */
    private Integer outType;
    /**
     * 下班时间点
     */
    private String outPoint;
    /**
     * 下班缺卡当日还是次日，1当日 2次日
     */
    private Integer outLackType;
    /**
     * 下班缺卡时间点
     */
    private String outLackPoint;
    /**
     * 考勤配置id
     */
    private String settingId;
    /**
     * 考勤组id
     */
    private String groupId;
    /**
     * 租户id
     */
    private String tenantId;
    /**
     * 排序
     */
    private Integer sort;
    /**
     * 班次id
     */
    private String shiftId;
    /**
     * 有效时长
     */
    private Integer validDuration;

    public Boolean equalsPeriod(AttendanceShiftSettingPeriodEntity period) {
        if (!Objects.equals(this.systemType, period.getSystemType())) {
            return false;
        }
        if (!Objects.equals(this.lateEnable, period.getLateEnable())) {
            return false;
        }
        if (!Objects.equals(this.earlyEnable, period.getEarlyEnable())) {
            return false;
        }
        if (!Objects.equals(this.breakEnable, period.getBreakEnable())) {
            return false;
        }
        if (!Objects.equals(this.nextDayEnable, period.getNextDayEnable())) {
            return false;
        }
        if (!StringUtil.equals(this.clockStartPoint, period.getClockStartPoint())) {
            return false;
        }
        if (!StringUtil.equals(this.inPoint, period.getInPoint())) {
            return false;
        }
        if (!StringUtil.equals(this.latePoint, period.getLatePoint())) {
            return false;
        }
        if (!StringUtil.equals(this.inLackPoint, period.getInLackPoint())) {
            return false;
        }
        if (!Objects.equals(this.breakStartType, period.getBreakStartType())) {
            return false;
        }
        if (!StringUtil.equals(this.breakStartPoint, period.getBreakStartPoint())) {
            return false;
        }
        if (!Objects.equals(this.breakEndType, period.getBreakEndType())) {
            return false;
        }
        if (!StringUtil.equals(this.breakEndPoint, period.getBreakEndPoint())) {
            return false;
        }
        if (!Objects.equals(this.earlyType, period.getEarlyType())) {
            return false;
        }
        if (!StringUtil.equals(this.earlyPoint, period.getEarlyPoint())) {
            return false;
        }
        if (!Objects.equals(this.outType, period.getOutType())) {
            return false;
        }
        if (!StringUtil.equals(this.outPoint, period.getOutPoint())) {
            return false;
        }
        if (!Objects.equals(this.outLackType, period.getOutLackType())) {
            return false;
        }
        if (!StringUtil.equals(this.outLackPoint, period.getOutLackPoint())) {
            return false;
        }
        if (!Objects.equals(this.inType, period.getInType())) {
            return false;
        }
        if (!Objects.equals(this.clockStartPointType, period.getClockStartPointType())) {
            return false;
        }
        if (!Objects.equals(this.inLackPointType, period.getInLackPointType())) {
            return false;
        }
        if (!Objects.equals(this.lateType, period.getLateType())) {
            return false;
        }
        return true;
    }

    public Integer calValidDuration() {
        Date date = new Date();
        Date inPoint = DateDetail.getDateByPoint(date, getInPoint(), getInType());
        Date breakStartPoint = DateDetail.getDateByPoint(date, getBreakStartPoint(), getBreakStartType());
        Date breakEndPoint = DateDetail.getDateByPoint(date, getBreakEndPoint(), getBreakEndType());
        Date outPoint = DateDetail.getDateByPoint(date, getOutPoint(), getOutType());
        Integer validDuration = DateDetail.calculateMinuteDiff(inPoint, outPoint);
        if (getBreakEnable() == 1 && Objects.nonNull(breakStartPoint) && Objects.nonNull(breakEndPoint)) {
            return validDuration - DateDetail.calculateMinuteDiff(breakStartPoint, breakEndPoint);
        }
        return validDuration;
    }

}
