package com.pz.system.datastructure;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;

import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;

/**
 * <p>created in  2023/9/15 14:55
 *
 * @author WangMin
 * @version 1.0
 */
@Data
@Slf4j
public class TotalOrderDelayOperator implements Delayed {

    /**
     * 主订单ID
     */
    private Long orderId;


    /**
     * 订单过期时间
     */
    private long expirationTime;

    /**
     * 订单过期执行操作
     */
    private Consumer<Long> action;

    public TotalOrderDelayOperator(Long orderId, long expirationTime, Consumer<Long> action) {
        this.orderId = orderId;
        this.expirationTime = expirationTime;
        this.action = action;
    }

    @Override
    public long getDelay(@NotNull TimeUnit unit) {
        // 计算订单到期时间和当前时间的时间差,并返回以指定时间单位表示的延迟时间
        long diff = expirationTime - System.currentTimeMillis();
        return unit.convert(diff, TimeUnit.MILLISECONDS);
    }

    @Override
    public int compareTo(@NotNull Delayed o) {
        // 比较订单到期时间先后顺序
        return Long.compare(expirationTime, ((TotalOrderDelayOperator) o).getExpirationTime());
    }


    /**
     * 订单过期操作
     */
    public void operator() {
        try {
            if (action != null && orderId != null) {
                action.accept(orderId);
            }
        } catch (Exception e) {
            log.error("订单延迟任务执行失败 cause:{}", e.getMessage());
        }
    }

}