from typing import List, Optional, Dict, Union from datetime import datetime from sqlalchemy.orm import Session from sqlalchemy import desc from models.shoe import Shoe from schemas.shoe import ShoeCreate, ShoeUpdate def get_shoes_by_name(db: Session, name: str) -> List[Shoe]: """ Get shoes by name with case-insensitive search. Args: db: Database session name: Name to search for Returns: List of matching Shoe objects """ return db.query(Shoe).filter(Shoe.name.ilike(f'%{name}%')).all() def get_shoes_by_brand_and_size(db: Session, brand: str, size: int) -> List[Shoe]: """ Get shoes filtered by brand and size. Args: db: Database session brand: Brand name to filter size: Shoe size to filter Returns: List of matching Shoe objects """ return db.query(Shoe).filter( Shoe.brand == brand, Shoe.size == size ).all() def validate_shoe_data(shoe_data: Union[ShoeCreate, ShoeUpdate]) -> Dict[str, str]: """ Validate shoe data before creation/update. Args: shoe_data: Shoe data to validate Returns: Dict with error message if validation fails, empty dict if valid """ errors = {} if shoe_data.size <= 0: errors["size"] = "Size must be positive" if shoe_data.price and shoe_data.price < 0: errors["price"] = "Price cannot be negative" if shoe_data.purchase_date and shoe_data.purchase_date > datetime.now(): errors["purchase_date"] = "Purchase date cannot be in the future" return errors def get_shoes_by_condition(db: Session, condition: str) -> List[Shoe]: """ Get shoes filtered by condition. Args: db: Database session condition: Condition to filter by Returns: List of matching Shoe objects """ return db.query(Shoe).filter(Shoe.condition == condition).all() def calculate_collection_value(db: Session) -> Dict[str, Union[int, List[Dict[str, Any]]]]: """ Calculate total value of shoe collection and get price breakdown. Args: db: Database session Returns: Dict containing total value and price breakdown by brand """ shoes = db.query(Shoe).all() total_value = sum(shoe.price for shoe in shoes if shoe.price) brand_breakdown = {} for shoe in shoes: if shoe.price: brand_breakdown[shoe.brand] = brand_breakdown.get(shoe.brand, 0) + shoe.price return { "total_value": total_value, "brand_breakdown": [ {"brand": brand, "value": value} for brand, value in brand_breakdown.items() ] }