from pydantic import BaseModel, Field from typing import Optional from datetime import datetime from enum import Enum class ExpenseType(str, Enum): INCOME = "income" EXPENSE = "expense" class Expense(BaseModel): user_id: str amount: float = Field(..., gt=0, description="Expense amount") category: str = Field(..., description="Expense category (e.g., Groceries, Transport)") description: Optional[str] = None date: datetime type: ExpenseType = ExpenseType.EXPENSE class Budget(BaseModel): user_id: str category: str amount: float = Field(..., gt=0, description="Budget amount") period: str = Field(..., description="Budget period: daily, weekly, monthly, yearly") start_date: datetime end_date: Optional[datetime] = None class BudgetRecommendation(BaseModel): category: str average_expense: float recommended_budget: float reason: str confidence: float = Field(..., ge=0, le=1, description="Confidence score (0-1)") action: Optional[str] = Field( None, description="AI suggestion: increase, decrease, or keep" ) class CategoryExpense(BaseModel): category: str average_monthly_expense: float total_expenses: int months_analyzed: int