from pydantic import BaseModel, EmailStr, Field, field_validator, ConfigDict
from typing import Optional
from datetime import datetime
from enum import Enum


class UserRole(str, Enum):
    GUEST = "GUEST"
    BUYER = "BUYER"
    SELLER = "SELLER"
    MODERATOR = "MODERATOR"
    ADMIN = "ADMIN"


class AddressType(str, Enum):
    SHIPPING = "SHIPPING"
    BILLING = "BILLING"


class UserBase(BaseModel):
    email: EmailStr
    role: UserRole
    is_active: bool = True
    is_verified: bool = False


class UserCreate(UserBase):
    password: str

    @field_validator("password")
    @classmethod
    def validate_password(cls, v: str) -> str:
        if len(v) < 8:
            raise ValueError("Password must be at least 8 characters long")
        if not any(c.isupper() for c in v):
            raise ValueError("Password must contain at least one uppercase letter")
        if not any(c.islower() for c in v):
            raise ValueError("Password must contain at least one lowercase letter")
        if not any(c.isdigit() for c in v):
            raise ValueError("Password must contain at least one number")
        return v


class UserUpdate(BaseModel):
    email: Optional[EmailStr] = None
    role: Optional[UserRole] = None
    is_active: Optional[bool] = None
    is_verified: Optional[bool] = None
    last_login_at: Optional[datetime] = None

    model_config = ConfigDict(from_attributes=True)


class UserResponse(UserBase):
    id: str
    last_login_at: Optional[datetime] = None
    created_at: datetime
    updated_at: datetime

    model_config = ConfigDict(from_attributes=True)


class UserprofileBase(BaseModel):
    first_name: Optional[str] = None
    last_name: Optional[str] = None
    display_name: Optional[str] = None
    bio: Optional[str] = None
    avatar_url: Optional[str] = None
    phone: Optional[str] = None
    location: Optional[str] = None
    timezone: Optional[str] = None


class UserprofileCreate(UserprofileBase):
    user_id: str


class UserprofileUpdate(BaseModel):
    first_name: Optional[str] = None
    last_name: Optional[str] = None
    display_name: Optional[str] = None
    bio: Optional[str] = None
    avatar_url: Optional[str] = None
    phone: Optional[str] = None
    location: Optional[str] = None
    timezone: Optional[str] = None

    model_config = ConfigDict(from_attributes=True)


class UserprofileResponse(UserprofileBase):
    id: str
    user_id: str
    created_at: datetime
    updated_at: datetime

    model_config = ConfigDict(from_attributes=True)


class SellerprofileBase(BaseModel):
    store_name: str
    store_description: Optional[str] = None
    store_logo_url: Optional[str] = None
    average_rating: Optional[str] = None
    total_sales: str = "0"
    total_reviews: str = "0"
    response_time_hours: Optional[str] = None
    is_verified_seller: bool = False


class SellerprofileCreate(SellerprofileBase):
    user_id: str


class SellerprofileUpdate(BaseModel):
    store_name: Optional[str] = None
    store_description: Optional[str] = None
    store_logo_url: Optional[str] = None
    average_rating: Optional[str] = None
    total_sales: Optional[str] = None
    total_reviews: Optional[str] = None
    response_time_hours: Optional[str] = None
    is_verified_seller: Optional[bool] = None

    model_config = ConfigDict(from_attributes=True)


class SellerprofileResponse(SellerprofileBase):
    id: str
    user_id: str
    created_at: datetime
    updated_at: datetime

    model_config = ConfigDict(from_attributes=True)


class AddressBase(BaseModel):
    address_type: AddressType
    is_default: bool = False
    recipient_name: str
    address_line1: str
    address_line2: Optional[str] = None
    city: str
    state: str
    postal_code: str
    country: str
    phone: Optional[str] = None

    @field_validator("address_line1", "city", "state", "postal_code", "country", "recipient_name")
    @classmethod
    def validate_required_fields(cls, v: str) -> str:
        if not v or not v.strip():
            raise ValueError("This field is required and cannot be empty")
        return v


class AddressCreate(AddressBase):
    user_id: str


class AddressUpdate(BaseModel):
    address_type: Optional[AddressType] = None
    is_default: Optional[bool] = None
    recipient_name: Optional[str] = None
    address_line1: Optional[str] = None
    address_line2: Optional[str] = None
    city: Optional[str] = None
    state: Optional[str] = None
    postal_code: Optional[str] = None
    country: Optional[str] = None
    phone: Optional[str] = None

    model_config = ConfigDict(from_attributes=True)


class AddressResponse(AddressBase):
    id: str
    user_id: str
    created_at: datetime
    updated_at: datetime

    model_config = ConfigDict(from_attributes=True)


class UserProfileDetailsResponse(BaseModel):
    id: str
    email: EmailStr
    role: UserRole
    is_active: bool
    is_verified: bool
    last_login_at: Optional[datetime] = None
    created_at: datetime
    updated_at: datetime
    user_profile: Optional[UserprofileResponse] = None
    seller_profile: Optional[SellerprofileResponse] = None

    model_config = ConfigDict(from_attributes=True)