from marshmallow import Schema, fields, validate 
from app.utils.password_generator import common_passwords

class RegisterSchema(Schema):
    """
    Schema for validating user registration data.

    Attributes:
        username (str): User's chosen username.
        first_name (str): User's first name.
        last_name (str): User's last name.
        email (str): User's email address.
        password (str): User's password.
        password_confirm (str): Confirmation of the user's password.
    """
    allowed_company_types = ["Anonymous Company", "Brands Company", "Ad Agency Company", "TV Channels Company"]

    # Define the username field (not required and without validation)
    username = fields.String(
        required=False,  # Username is not required
        description='User username'  # Description for the username field
    ) 
    
    # Define the company_name field with required and validation rules
    company_name = fields.String(
        required=False,  # First name is required
        validate=[
            validate.Length(min=1, max=150, error="company name must be between 1 and 150 characters"),
        ],
        error_messages={'required': 'company name is required.'},  # Custom error message for required field
        description='User company name'  # Description for the company_name field
    )

    # Define the last_name field with required and validation rules
    company_type = fields.String(
        required=True,  # company_type is required
        validate=[
            validate.Length(min=1, max=50, error="Company type must be between 1 and 50 characters"),
            validate.OneOf(allowed_company_types, error="Invalid company type"),
        ],
        error_messages={'required': 'Company type is required.'},  # Custom error message for required field
        description='User Company type'  # Description for the company_type field
    )

    # Define the email field with required and validation rules
    email = fields.String(
        required=True,  # Email is required
        validate=[
            validate.Email(error="Invalid email format"),  # Validate as an email address
            validate.Length(min=5, max=100, error="Email must be between 5 and 100 characters"),  # Specify length range
        ],
        error_messages={'required': 'Email is required.'},  # Custom error message for required field
        description='User email'  # Description for the email field
    )

    # Define the password field with required and validation rules
    password = fields.String(
        required=True,  # Password is required
        validate=[
            validate.Length(min=8, error="Password must be at least 8 characters"),  # Minimum password length
            validate.Regexp(
                r"^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).+$",
                error="Password must contain at least one lowercase letter, one uppercase letter, and one digit"  # Complex password requirements using regex
            ),
        ],
        error_messages={'required': 'Password is required.'},  # Custom error message for required field
        description='User password'  # Description for the password field
    )

    # Define the password_confirm field for confirming the password
    password_confirm = fields.String(
        required=True,  # Password confirmation is required
        validate=[
            validate.Length(min=8, error="Password must be at least 8 characters"),
            validate.NoneOf(common_passwords, error='Common or easily guessable password.'), 
        ],
        error_messages={'required': 'Password confirmation is required.'},  # Custom error message for required field
        description='Confirm password'  # Description for the password_confirm field
    )