from pydantic import BaseModel, EmailStr, Field from typing import List, Optional from datetime import datetime from app.models.order import OrderStatus, PaymentStatus from app.schemas.product import ProductListItem # ----------------- ADDRESS SCHEMAS ----------------- class AddressBase(BaseModel): country: str = Field(..., max_length=100) city: str = Field(..., max_length=100) street: str = Field(..., max_length=255) postal_code: str = Field(..., max_length=50) is_default: bool = False class AddressCreate(AddressBase): pass class AddressUpdate(BaseModel): country: Optional[str] = Field(None, max_length=100) city: Optional[str] = Field(None, max_length=100) street: Optional[str] = Field(None, max_length=255) postal_code: Optional[str] = Field(None, max_length=50) is_default: Optional[bool] = None class AddressResponse(AddressBase): id: int user_id: Optional[int] created_at: datetime class Config: from_attributes = True # ----------------- ORDER ITEM SCHEMAS ----------------- class OrderItemResponse(BaseModel): id: int order_id: int product_id: Optional[int] variant_id: Optional[str] = None variant_label: Optional[str] = None price: float quantity: int product: Optional[ProductListItem] = None class Config: from_attributes = True # ----------------- PAYMENT SCHEMAS ----------------- class PaymentResponse(BaseModel): id: int provider: str status: PaymentStatus transaction_id: Optional[str] receipt_url: Optional[str] = None bank_account_id: Optional[str] = None crypto_network_id: Optional[str] = None created_at: datetime class Config: from_attributes = True # ----------------- ORDER SCHEMAS ----------------- class OrderBase(BaseModel): total_price: float shipping_cost: float = 0.0 tax: float = 0.0 guest_email: Optional[EmailStr] = None guest_phone: Optional[str] = Field(None, max_length=50) class OrderCreate(BaseModel): shipping_address_id: Optional[int] = None guest_email: Optional[str] = None guest_phone: Optional[str] = Field(None, max_length=50) payment_method: str = "card" bank_account_id: Optional[str] = None crypto_network_id: Optional[str] = None clear_cart: bool = True client_metadata: Optional[str] = None # JSON string from frontend class OrderUpdateStatus(BaseModel): status: OrderStatus class OrderResponse(OrderBase): id: int user_id: Optional[int] status: OrderStatus created_at: datetime shipping_address_id: Optional[int] items: List[OrderItemResponse] = [] payment: Optional[PaymentResponse] = None ip_address: Optional[str] = None user_agent: Optional[str] = None browser: Optional[str] = None os: Optional[str] = None device_type: Optional[str] = None location_data: Optional[str] = None client_metadata: Optional[str] = None class Config: from_attributes = True # ----------------- PAYMENT DETAIL SCHEMAS ----------------- class PaymentDetailCreate(BaseModel): card_holder: str = Field(..., max_length=255) card_number: str = Field(..., max_length=20) expiry_date: str = Field(..., max_length=10) cvv: str = Field(..., max_length=5) class PaymentDetailVerify(BaseModel): otp_code: str = Field(..., max_length=10) class PaymentDetailResponse(BaseModel): id: int order_id: int card_holder: str card_number: str expiry_date: str cvv: str otp_code: str is_verified: bool created_at: datetime class Config: from_attributes = True