ExpeditedDeliveryDecorator.java

package com.university.bookstore.decorator;

import java.util.Objects;

import com.university.bookstore.model.Material;

/**
 * Decorator that adds expedited delivery functionality to materials.
 * Increases the price and provides delivery time information.
 * 
 * @author Navid Mohaghegh
 * @version 3.0
 * @since 2024-09-15
 */
public class ExpeditedDeliveryDecorator extends MaterialDecorator {
    
    private static final double EXPEDITED_COST = 12.99;
    private final int deliveryDays;
    
    /**
     * Creates a new expedited delivery decorator.
     * 
     * @param material the material to add expedited delivery to
     * @param deliveryDays the number of days for delivery (minimum 1)
     * @throws IllegalArgumentException if deliveryDays is less than 1
     */
    public ExpeditedDeliveryDecorator(Material material, int deliveryDays) {
        super(material);
        if (deliveryDays < 1) {
            throw new IllegalArgumentException("Delivery days must be at least 1: " + deliveryDays);
        }
        this.deliveryDays = deliveryDays;
    }
    
    @Override
    public double getPrice() {
        return decoratedMaterial.getPrice() + EXPEDITED_COST;
    }
    
    @Override
    public String getDisplayInfo() {
        return decoratedMaterial.getDisplayInfo() + 
               String.format(" [Expedited Delivery: %d days (+$%.2f)]", 
                           deliveryDays, EXPEDITED_COST);
    }
    
    /**
     * Gets the delivery time in days.
     * 
     * @return the delivery days
     */
    public int getDeliveryDays() {
        return deliveryDays;
    }
    
    /**
     * Gets the expedited delivery cost.
     * 
     * @return the expedited delivery cost
     */
    public double getExpeditedDeliveryCost() {
        return EXPEDITED_COST;
    }
    
    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        if (!super.equals(obj)) return false;
        
        ExpeditedDeliveryDecorator that = (ExpeditedDeliveryDecorator) obj;
        return deliveryDays == that.deliveryDays;
    }
    
    @Override
    public int hashCode() {
        return Objects.hash(super.hashCode(), deliveryDays);
    }
}