Budget Management Application
==============================

# budget_app.py
from dataclasses import dataclass, field
from typing import List

TAX_RATE = 0.15  # 15% tax rate

@dataclass
class Entry:
    description: str
    amount: float

@dataclass
class BudgetApp:
    incomes: List[Entry] = field(default_factory=list)
    expenses: List[Entry] = field(default_factory=list)

    def add_income(self, desc: str, amt: float):
        if amt <= 0:
            raise ValueError("Amount must be positive.")
        self.incomes.append(Entry(desc, amt))

    def add_expense(self, desc: str, amt: float):
        if amt <= 0:
            raise ValueError("Amount must be positive.")
        self.expenses.append(Entry(desc, amt))

    def total_income(self):
        return sum(e.amount for e in self.incomes)

    def total_expense(self):
        return sum(e.amount for e in self.expenses)

    def net(self):
        return self.total_income() - self.total_expense()

    def tax_due(self):
        net_profit = self.net()
        if net_profit > 0:
            return net_profit * TAX_RATE
        return 0.0

def print_menu():
    print("\n--- Budget Menu ---")
    print("1) Add income")
    print("2) Add expense")
    print("3) Show summary")
    print("0) Exit")

def main():
    app = BudgetApp()
    while True:
        print_menu()
        choice = input("Choose: ").strip()
        if choice == "1":
            desc = input("Income description: ").strip()
            amt = float(input("Amount: ").strip())
            try:
                app.add_income(desc, amt)
                print("Income added.")
            except ValueError as e:
                print("Error:", e)
        elif choice == "2":
            desc = input("Expense description: ").strip()
            amt = float(input("Amount: ").strip())
            try:
                app.add_expense(desc, amt)
                print("Expense added.")
            except ValueError as e:
                print("Error:", e)
        elif choice == "3":
            print("\n--- Summary ---")
            print(f"Total Income: {app.total_income():.2f}")
            print(f"Total Expenses: {app.total_expense():.2f}")
            net = app.net()
            print(f"Net Profit/Loss: {net:.2f}")
            tax = app.tax_due()
            if tax > 0:
                print(f"Tax due (@{TAX_RATE*100:.0f}%): {tax:.2f}")
            else:
                print("No tax due (no profit).")
        elif choice == "0":
            print("Goodbye.")
            break
        else:
            print("Invalid option.")

if __name__ == "__main__":
    main()
