package ai.aletyx;
import ai.aletyx.model.Charge;
import ai.aletyx.model.Order;
import org.drools.ruleunits.api.RuleUnitInstance;
import org.drools.ruleunits.api.RuleUnitProvider;
import org.drools.ruleunits.api.conf.RuleConfig;
import org.kie.api.resource.ResourceType;
import org.kie.internal.io.ResourceFactory;
import org.drools.io.ResourceFactoryService;
import org.kie.api.io.ResourceType;
import org.drools.ruleunits.api.RuleUnitInstance;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class ShippingChargesApp {
public static void main(String[] args) {
// Create a rule unit provider
RuleUnitProvider ruleUnitProvider = RuleUnitProvider.get();
// Create a rule unit data store
ShippingUnit shippingUnit = new ShippingUnit();
// Create a rule unit instance
try (RuleUnitInstance<ShippingUnit> instance = ruleUnitProvider.createRuleUnitInstance(shippingUnit)) {
// Load the decision table
instance.getKieSession().getKieBase().newKieBuilder()
.add(ResourceFactory.newClassPathResource("rules/ShippingCharges.drl.xlsx"), ResourceType.DTABLE)
.build();
// Interactive command line interface
Scanner scanner = new Scanner(System.in);
boolean running = true;
while (running) {
System.out.println("\n=== Shipping Charge Calculator ===");
System.out.println("1. Calculate shipping charge");
System.out.println("2. Exit");
System.out.print("Enter choice: ");
int choice = scanner.nextInt();
scanner.nextLine(); // Consume newline
switch (choice) {
case 1:
calculateShipping(scanner, shippingUnit, instance);
break;
case 2:
running = false;
break;
default:
System.out.println("Invalid choice!");
}
}
System.out.println("Thank you for using the Shipping Charge Calculator!");
}
}
private static void calculateShipping(Scanner scanner, ShippingUnit shippingUnit, RuleUnitInstance<ShippingUnit> instance) {
System.out.print("Enter number of items: ");
int itemsCount = scanner.nextInt();
System.out.print("Enter order total: $");
double total = scanner.nextDouble();
System.out.println("Select delivery speed:");
System.out.println("1. Next Day (1)");
System.out.println("2. Second Day (2)");
System.out.println("3. Standard (5)");
System.out.print("Enter choice (1-3): ");
int deliveryChoice = scanner.nextInt();
int deliverInDays;
switch (deliveryChoice) {
case 1: deliverInDays = 1; break;
case 2: deliverInDays = 2; break;
case 3: deliverInDays = 5; break;
default: deliverInDays = 5;
}
// Create the order
Order order = new Order(itemsCount, total, deliverInDays);
shippingUnit.getOrders().add(order);
// Fire rules
instance.fire();
// Get results
List<Charge> charges = new ArrayList<>(shippingUnit.getCharges());
if (!charges.isEmpty()) {
System.out.println("\nShipping charge: $" + charges.get(charges.size() - 1).getAmount());
} else {
System.out.println("\nNo shipping charge calculated.");
}
// Clear data for next calculation
shippingUnit.getOrders().clear();
shippingUnit.getCharges().clear();
}
// Rule Unit class
public static class ShippingUnit {
private final List<Order> orders = new ArrayList<>();
private final List<Charge> charges = new ArrayList<>();
public List<Order> getOrders() {
return orders;
}
public List<Charge> getCharges() {
return charges;
}
}
}