import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class BudgetManager {
    private static Map<String, Double> initialExpenses = new HashMap<>();
    private static Map<String, Double> consumedExpenses = new HashMap<>();
    private static double totalBudget;
    private static double totalConsumed = 0.0; // Total consumed budget

    public static void main(String[] args) {
        customizeBudgetAndCategories();
        printBudgetStatus();

        Scanner scanner = new Scanner(System.in);

        while (true) {
            System.out.println("1. Ajouter une dépense ");
            System.out.println("2. Afficher le statut du budget");
            System.out.println("3. Ajouter une catégorie");
            System.out.println("4. Quitter");
            int choice = scanner.nextInt();
            scanner.nextLine(); 

            switch (choice) {
                case 1:
                    System.out.print("Catégorie de la depense : ");
                    String category = scanner.nextLine();
                    System.out.print("Montant de la depense : ");
                    double amount = scanner.nextDouble();
                    scanner.nextLine(); 
                    if (addTransaction(amount, category)) {
                        System.out.println("montant enregistre  " + category + " mis à jour.");
                    }
                    break;
                case 2:
                    printBudgetStatus();
                    break;
                case 3:
                    addCategory(scanner);
                    break;
                case 4:
                    System.out.println("Au revoir !");
                    return;
                default:
                    System.out.println("Choix invalide. Veuillez réessayer.");
            }
        }
    }
    private static void customizeBudgetAndCategories() {
        Scanner scanner = new Scanner(System.in);
        System.out.print("Entrez votre budget initial : ");
        totalBudget = scanner.nextDouble();
        scanner.nextLine(); // Consume the newline character
        System.out.print("Entrez le nombre de catégories : ");
        int numCategories = scanner.nextInt();
        scanner.nextLine(); // Consume the newline character
        for (int i = 0; i < numCategories; i++) {
            addCategory(scanner);
        }
    }

    private static void addCategory(Scanner scanner) {
        System.out.print("Nom de la  catégorie : ");
        String categoryName = scanner.nextLine();
        System.out.print("Montant initial pour " + categoryName + " : ");
        double initialAmount = scanner.nextDouble();
        scanner.nextLine(); 
        initialExpenses.put(categoryName, initialAmount);
        consumedExpenses.put(categoryName, 0.0);
        System.out.println("Catégorie '" + categoryName + "' ajoutee avec succès.");
    }

    private static boolean addTransaction(double amount, String category) {
        if (initialExpenses.containsKey(category)) {
            double currentConsumed = consumedExpenses.get(category);
            consumedExpenses.put(category, currentConsumed + amount);
            totalConsumed += amount; 
            return true;
        } else {
            System.out.println("Catégorie invalide.");
            return false;
        }
    }

    private static void printBudgetStatus() {
        System.out.println("Statut du budget :");
        for (String category : initialExpenses.keySet()) {
            double initialAmount = initialExpenses.get(category);
            double consumedAmount = consumedExpenses.get(category);
            System.out.println(category + ": " + consumedAmount + "/" + initialAmount);
        }
        System.out.println("Budget total : " + totalConsumed + " / " + totalBudget);
        System.out.println("Budget restant : " + (totalBudget - totalConsumed));
        System.out.println();
    }
}
