from pydantic import BaseModel, EmailStr, Field, ConfigDict from typing import Optional from datetime import datetime, date from ..models.models import UserRole, MembershipStatus, PaymentStatus, PaymentMethod # User Schemas class UserBase(BaseModel): email: EmailStr first_name: str = Field(..., min_length=1, max_length=100) last_name: str = Field(..., min_length=1, max_length=100) phone: Optional[str] = None address: Optional[str] = None class UserCreate(UserBase): password: str = Field(..., min_length=8) class UserUpdate(BaseModel): first_name: Optional[str] = Field(None, min_length=1, max_length=100) last_name: Optional[str] = Field(None, min_length=1, max_length=100) phone: Optional[str] = None address: Optional[str] = None class UserResponse(UserBase): model_config = ConfigDict(from_attributes=True) id: int role: UserRole is_active: bool created_at: datetime last_login: Optional[datetime] = None class UserInDB(UserResponse): hashed_password: str # Authentication Schemas class Token(BaseModel): access_token: str token_type: str = "bearer" class TokenData(BaseModel): user_id: Optional[int] = None class LoginRequest(BaseModel): email: EmailStr password: str # Password Reset Schemas class ForgotPasswordRequest(BaseModel): email: EmailStr class ResetPasswordRequest(BaseModel): token: str = Field(..., min_length=1) new_password: str = Field(..., min_length=8) # Membership Tier Schemas class MembershipTierBase(BaseModel): name: str = Field(..., min_length=1, max_length=100) description: Optional[str] = None annual_fee: float = Field(..., ge=0) benefits: Optional[str] = None class MembershipTierCreate(MembershipTierBase): pass class MembershipTierUpdate(BaseModel): name: Optional[str] = Field(None, min_length=1, max_length=100) description: Optional[str] = None annual_fee: Optional[float] = Field(None, ge=0) benefits: Optional[str] = None is_active: Optional[bool] = None class MembershipTierResponse(MembershipTierBase): model_config = ConfigDict(from_attributes=True) id: int is_active: bool created_at: datetime # Membership Schemas class MembershipBase(BaseModel): tier_id: int auto_renew: bool = False class MembershipCreate(MembershipBase): start_date: date end_date: date class MembershipUpdate(BaseModel): tier_id: Optional[int] = None status: Optional[MembershipStatus] = None end_date: Optional[date] = None auto_renew: Optional[bool] = None class MembershipResponse(BaseModel): model_config = ConfigDict(from_attributes=True) id: int user_id: int tier_id: int status: MembershipStatus start_date: date end_date: date auto_renew: bool created_at: datetime tier: MembershipTierResponse # Payment Schemas class PaymentBase(BaseModel): amount: float = Field(..., gt=0) payment_method: PaymentMethod notes: Optional[str] = None class PaymentCreate(PaymentBase): membership_id: Optional[int] = None class PaymentUpdate(BaseModel): status: Optional[PaymentStatus] = None transaction_id: Optional[str] = None payment_date: Optional[datetime] = None notes: Optional[str] = None class PaymentResponse(BaseModel): model_config = ConfigDict(from_attributes=True) id: int user_id: int membership_id: Optional[int] = None amount: float payment_method: PaymentMethod status: PaymentStatus transaction_id: Optional[str] = None payment_date: Optional[datetime] = None notes: Optional[str] = None created_at: datetime # Message Response class MessageResponse(BaseModel): message: str detail: Optional[str] = None