from pydantic import BaseModel, ConfigDict from typing import List, Optional from decimal import Decimal class UserCostShare(BaseModel): user_id: int user_identifier: str # Name or email items_added_value: Decimal = Decimal("0.00") # Total value of items this user added amount_due: Decimal # The user's share of the total cost (for equal split, this is total_cost / num_users) balance: Decimal # items_added_value - amount_due model_config = ConfigDict(from_attributes=True) class ListCostSummary(BaseModel): list_id: int list_name: str total_list_cost: Decimal num_participating_users: int equal_share_per_user: Decimal user_balances: List[UserCostShare] model_config = ConfigDict(from_attributes=True) class UserBalanceDetail(BaseModel): user_id: int user_identifier: str # Name or email total_paid_for_expenses: Decimal = Decimal("0.00") total_share_of_expenses: Decimal = Decimal("0.00") total_settlements_paid: Decimal = Decimal("0.00") total_settlements_received: Decimal = Decimal("0.00") net_balance: Decimal = Decimal("0.00") # (paid_for_expenses + settlements_received) - (share_of_expenses + settlements_paid) model_config = ConfigDict(from_attributes=True) class SuggestedSettlement(BaseModel): from_user_id: int from_user_identifier: str # Name or email of payer to_user_id: int to_user_identifier: str # Name or email of payee amount: Decimal model_config = ConfigDict(from_attributes=True) class GroupBalanceSummary(BaseModel): group_id: int group_name: str overall_total_expenses: Decimal = Decimal("0.00") overall_total_settlements: Decimal = Decimal("0.00") user_balances: List[UserBalanceDetail] # Optional: Could add a list of suggested settlements to zero out balances suggested_settlements: Optional[List[SuggestedSettlement]] = None model_config = ConfigDict(from_attributes=True) # class SuggestedSettlement(BaseModel): # from_user_id: int # to_user_id: int # amount: Decimal