import static lib_refining.PrlConstants.*;

/**
 * {@summary Defines plan execution status based on actual-to-planned ratio.}
 * <p>
 * <p>Status is determined using predefined threshold values.
 *
 * <p>Used to classify plan execution progress into discrete states.
 *
 * <p>Used in {@link Source}, {@link ShipmentNode}, and {@link FlowQuota}
 * to track plan execution progress.
 * <p>
 * #LibRefiningApi
 */
public enum PlanCompletionStatus {

    PLAN_NOT_DEFINED(0),
    PLAN_NOT_COMPLETED(1),
    PLAN_ALMOST_COMPLETED(2),
    PLAN_COMPLETED(3),
    PLAN_OVERCOMPLETED(4);

    private static final double NOT_COMPLETED_THRESHOLD = 0.9;
    private static final double ALMOST_COMPLETED_THRESHOLD = 0.95;
    private static final double COMPLETED_THRESHOLD = 1.0;

    private final int level;

    PlanCompletionStatus(int level) {
        this.level = level;
    }

    
/**
 * {@summary Returns numeric level of status.}
 * <p>
 * #LibRefiningApi
 *
 * @return status level
 */ 
    public int getLevel() {
        return level;
    }

/**
 * {@summary Resolves plan completion status by completion ratio.}
 * <p>
 * <p>Status is determined using threshold values:
 * <ul>
 *   <li>{@code < 0.9} → {@link #PLAN_NOT_COMPLETED}</li>
 *   <li>{@code [0.9, 0.95)} → {@link #PLAN_ALMOST_COMPLETED}</li>
 *   <li>{@code [0.95, 1.0 + ε]} → {@link #PLAN_COMPLETED}</li>
 *   <li>{@code > 1.0 + ε} → {@link #PLAN_OVERCOMPLETED}</li>
 * </ul>
 *
 * <p>If {@code plan == 0}, returns {@link #PLAN_NOT_DEFINED}.
 *
 * <p>{@code ε} corresponds to {@link PrlConstants#MIN_THRESHOLD_VALUE}.
 * <p>
 * #LibRefiningApi
 *
 * @param plan planned value
 * @param completionRatio completion ratio (actual / plan), may exceed {@code 1.0}
 * @return corresponding completion status
 */
    public static PlanCompletionStatus from(double plan, double completionRatio) {
    	
        if (plan == 0) {
            return PLAN_NOT_DEFINED;
        }

        if (completionRatio < NOT_COMPLETED_THRESHOLD) {
            return PLAN_NOT_COMPLETED;
        }

        if (completionRatio < ALMOST_COMPLETED_THRESHOLD) {
            return PLAN_ALMOST_COMPLETED;
        }

        if (completionRatio <= COMPLETED_THRESHOLD + MIN_THRESHOLD_VALUE) {
            return PLAN_COMPLETED;
        }

        return PLAN_OVERCOMPLETED;
    }
}