from pydantic import BaseModel, HttpUrl, Field, validator
from typing import Optional, Dict, Any, List
from datetime import datetime, date
from app.models.user_profile import ProfileVisibility, ProfileStatus

class ProfileCreate(BaseModel):
    user_id: str
    email: str
    username: str
    first_name: Optional[str] = None
    last_name: Optional[str] = None

class ProfileUpdate(BaseModel):
    first_name: Optional[str] = Field(None, max_length=50)
    last_name: Optional[str] = Field(None, max_length=50)
    display_name: Optional[str] = Field(None, max_length=50)
    bio: Optional[str] = Field(None, max_length=500)
    phone: Optional[str] = Field(None, max_length=20)
    website: Optional[HttpUrl] = None
    country: Optional[str] = Field(None, max_length=100)
    city: Optional[str] = Field(None, max_length=100)
    timezone: Optional[str] = Field(None, max_length=50)
    birth_date: Optional[date] = None
    gender: Optional[str] = Field(None, max_length=20)
    visibility: Optional[ProfileVisibility] = None
    social_links: Optional[Dict[str, str]] = None
    tags: Optional[List[str]] = None
    custom_fields: Optional[Dict[str, Any]] = None

    @validator('social_links')
    def validate_social_links(cls, v):
        if v:
            allowed_platforms = ['github', 'linkedin', 'twitter', 'instagram', 'facebook', 'youtube']
            for platform in v.keys():
                if platform not in allowed_platforms:
                    raise ValueError(f'Unsupported social platform: {platform}')
        return v

    @validator('tags')
    def validate_tags(cls, v):
        if v and len(v) > 20:
            raise ValueError('Maximum 20 tags allowed')
        return v

class ProfileResponse(BaseModel):
    id: str
    user_id: str
    email: str
    username: str
    first_name: Optional[str] = None
    last_name: Optional[str] = None
    display_name: Optional[str] = None
    full_name: Optional[str] = None
    bio: Optional[str] = None
    phone: Optional[str] = None
    website: Optional[str] = None
    country: Optional[str] = None
    city: Optional[str] = None
    timezone: str = "UTC"
    avatar_url: Optional[str] = None
    cover_photo_url: Optional[str] = None
    social_links: Dict[str, str] = Field(default_factory=dict)
    birth_date: Optional[date] = None
    gender: Optional[str] = None
    visibility: ProfileVisibility
    status: ProfileStatus = ProfileStatus.ACTIVE
    profile_completion_percentage: int
    followers_count: int = 0
    following_count: int = 0
    posts_count: int = 0
    created_at: datetime
    updated_at: datetime
    last_seen: Optional[datetime] = None
    tags: List[str] = Field(default_factory=list)
    custom_fields: Dict[str, Any] = Field(default_factory=dict)
    roles: List[str] = Field(default_factory=list)

    class Config:
        from_attributes = True

class ProfileStats(BaseModel):
    total_profiles: int
    active_profiles: int
    incomplete_profiles: int
    suspended_profiles: int
    recent_profiles: int
    completion_stats: Dict[str, int]

class ProfileSearchRequest(BaseModel):
    query: Optional[str] = ""
    country: Optional[str] = None
    city: Optional[str] = None
    tags: Optional[List[str]] = None
    min_completion: Optional[int] = None
    visibility: Optional[ProfileVisibility] = None
    limit: int = Field(20, ge=1, le=100)
    offset: int = Field(0, ge=0)

class ProfileSearchResponse(BaseModel):
    profiles: List[ProfileResponse]
    total_count: int
    offset: int
    limit: int
    has_more: bool

class AvatarUploadResponse(BaseModel):
    avatar_url: str
    message: str

class SocialLinkUpdate(BaseModel):
    platform: str
    username: str

    @validator('platform')
    def validate_platform(cls, v):
        allowed_platforms = ['github', 'linkedin', 'twitter', 'instagram', 'facebook', 'youtube']
        if v not in allowed_platforms:
            raise ValueError(f'Unsupported social platform: {v}')
        return v
