import re
import uuid
from datetime import datetime, timedelta

from fastapi import status
from sqlalchemy.orm import Session

from src.apps.auth.schemas.user_schemas import UserRegisterSchema
from src.apps.role_permission.models.role_model import Role
from src.apps.role_permission.models.user_permission_model import UserPermissions
from src.apps.user.models.user_model import Users
from src.apps.user.schemas.user_schemas import UserReturnSchema
from src.core.config import settings
from src.core.exceptions import APIException
from src.utils.enums import UserAccessLevel
from src.utils.helpers.functions import get_password_hash, get_site_settings_value


async def create_user(db: Session, payload: UserRegisterSchema, access_level: str) -> UserReturnSchema:
    # Check for existing email
    if db.query(Users).filter(Users.email == payload.email).first():
        raise APIException(
            module="auth",
            error={"email": "Email is already registered"},
            status_code=status.HTTP_400_BAD_REQUEST,
            message="Email is already registered",
        )

    # Check for existing phone
    if db.query(Users).filter(Users.phone == payload.phone).first():
        raise APIException(
            module="auth",
            error={"phone": "Phone number is already registered"},
            status_code=status.HTTP_400_BAD_REQUEST,
            message="Phone number is already registered",
        )

    # Generate username from phone and ensure uniqueness
    username = payload.email.replace("@", "_")

    # Hash password
    hashed_password = get_password_hash(payload.password)

    new_user = Users(
        user_id=str(uuid.uuid4()),
        username=username,
        email=payload.email,
        phone=payload.phone,
        password=hashed_password,
        is_active=True,
        is_verified=True,
        created_at=datetime.utcnow(),
        updated_at=datetime.utcnow(),
        first_name=payload.first_name,
        last_name=payload.last_name,
    )

    db.add(new_user)
    db.commit()
    db.refresh(new_user)

    # Assign role based on access_level
    if access_level.upper() in UserAccessLevel.__members__:
        try:
            role = db.query(Role).filter(Role.slug == UserAccessLevel[access_level.upper()].value).first()

            if role:
                # Create user-role mapping
                user_role = UserPermissions(user_id=new_user.id, role_id=role.id, is_primary=True)
                db.add(user_role)
                db.commit()
        except Exception as e:
            # Log the error but don't fail registration
            print(f"Error assigning role to user: {str(e)}")
    # Create verification token    

    return UserReturnSchema.model_validate(new_user)

