"""
Registration-related schemas for multi-step registration process
"""
from pydantic import BaseModel, EmailStr, validator
from typing import Optional, Literal
from uuid import UUID
from app.core.security import validate_password_strength


class EmailVerificationRequest(BaseModel):
    """Step 1: Email verification request"""
    email: EmailStr


class EmailVerificationConfirm(BaseModel):
    """Step 1: Email verification confirmation"""
    email: EmailStr
    verification_code: str


class UserTypeSelection(BaseModel):
    """Step 2: User type selection"""
    email: EmailStr
    user_type: Literal["user", "business"]


class PersonalInfoRegistration(BaseModel):
    """Step 3: Personal information"""
    email: EmailStr
    first_name: str
    last_name: str
    country_id: int
    language_id: int
    mobile: Optional[str] = None
    password: str
    confirm_password: str
    
    @validator('confirm_password')
    def passwords_match(cls, v, values):
        if 'password' in values and v != values['password']:
            raise ValueError('Passwords do not match')
        return v
    
    @validator('password')
    def validate_password(cls, v):
        is_valid, error_msg = validate_password_strength(v)
        if not is_valid:
            raise ValueError(error_msg)
        return v


class CompanyRegistration(BaseModel):
    """Step 4: Company information (for business users)"""
    email: EmailStr
    company_name: str
    address: str
    country_id: int
    province: str
    city: str
    postal_code: str
    phone: str
    vat_number: Optional[str] = None


class RegistrationComplete(BaseModel):
    """Registration completion response"""
    message: str
    user_id: UUID
    needs_company_approval: bool = False
    login_token: Optional[str] = None


class PendingRegistration(BaseModel):
    """Temporary storage for pending registration data"""
    email: EmailStr
    verification_code: str
    is_verified: bool = False
    user_type: Optional[str] = None
    personal_info: Optional[dict] = None
    company_info: Optional[dict] = None