CashInventory.java

package com.vikingcloud.horsetrack.model;

import com.vikingcloud.horsetrack.constants.DenominationConstants;

import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.Map;

import static com.vikingcloud.horsetrack.constants.DenominationConstants.AVAILABLE_DENOMINATIONS;
import static com.vikingcloud.horsetrack.constants.DenominationConstants.DEFAULT_RESTOCK_COUNTS;

public class CashInventory {
    private final Map<Integer, Integer> bills = new LinkedHashMap<>();

    public CashInventory() {
        restock();
    }

    public void dispenseBills(Map<Integer, Integer> dispensed) {
        for (Map.Entry<Integer, Integer> entry : dispensed.entrySet()) {
            int denomination = entry.getKey();
            int current = bills.getOrDefault(denomination, 0);
            int count = entry.getValue();
            bills.put(denomination, current - count);
        }
    }

    public void displayInventory() {
        System.out.println("Inventory:");
        Arrays.stream(DenominationConstants.AVAILABLE_DENOMINATIONS)
                .sorted() // ascending order
                .forEach(denomination -> {
                    int count = bills.getOrDefault(denomination, 0);
                    System.out.println("$" + denomination + "," + count);
                });
    }

    public Map<Integer, Integer> getBillsForPayout(int amount) {
        Map<Integer, Integer> toDispense = new LinkedHashMap<>();
        int remaining = amount;

        for (int denomination : AVAILABLE_DENOMINATIONS) {
            int available = bills.getOrDefault(denomination, 0);
            int needed = remaining / denomination;
            int canUse = Math.min(needed, available);

            if (canUse > 0) {
                toDispense.put(denomination, canUse);
                remaining -= canUse * denomination;
            }
        }

        return (remaining == 0) ? toDispense : null;
    }

    public void restock() {
        bills.clear();
        for (int denomination : AVAILABLE_DENOMINATIONS) {
            int inventory = DEFAULT_RESTOCK_COUNTS.getOrDefault(denomination, 0);
            bills.put(denomination, inventory);
        }
    }
}