package question1;

import java.util.HashMap;

public class InventoryManagement {

	// cnt[zone][product] = quantity
	HashMap<Integer, HashMap<Integer, Integer>> cnt = new HashMap<>();
	
	// ajoute dans une zone du stock une quantité donnée d’un produit donné
	void replenish(int product, int quantity, int destination_zone) throws ZoneFullException{
		cnt.putIfAbsent(destination_zone, new HashMap<>());
		cnt.get(destination_zone).putIfAbsent(product, 0);
		Integer q = cnt.get(destination_zone).get(product) + quantity;
		if(q > 100)
			throw new ZoneFullException();
		cnt.get(destination_zone).put(product, q);
	}

	// retire d’une zone spécifique du stock une quantité donnée d’un produit donné pour l’envoyer vers le réseau de distribution 
	void distribute(int product, int source_zone, int quantity) throws StockOutException{
		cnt.putIfAbsent(source_zone, new HashMap<>());
		cnt.get(source_zone).putIfAbsent(product, 0);
		Integer q = cnt.get(source_zone).get(product) - quantity;
		if(q < 0)
			throw new StockOutException();
		cnt.get(source_zone).put(product, q);
	}

	// déplace une quantité donnée d’un produit vers une autre zone 
	void move(int product, int quantity, int source_zone, int destination_zone) throws StockOutException, ZoneFullException {
		distribute(product, source_zone, quantity);
		try {
			replenish(product, quantity, destination_zone);
		}catch(ZoneFullException e){ 
			replenish(product, quantity, source_zone);
			throw e;
		}
	}
	
	// retourne la quantité disponible d’un produit donné dans le stock, toutes zones confondues 
	int quantity(int product){
		int sum[] = {0};
		cnt.forEach((key, value) -> {
			sum[0] += value.getOrDefault(product, 0);
		});
		return sum[0];
	}
}
