from apps.permissions.models import UserCompanyRole, Role
import logging
from apps.core.models import User


logger = logging.getLogger(__name__)


class UserRepository:

    @staticmethod
    def get_queryset():
        return User.objects.all()

    @staticmethod
    def get_user_by_active_company(active_company):
        return UserRepository.get_queryset().get(
            active_company=active_company
        )

    @staticmethod
    def get_user_by_phone_number(phone_number):
        return UserRepository.get_queryset().filter(
            profile__phone_number=phone_number
        ).first()

    @staticmethod
    def get_chief_admins_for_company(company):
        """Get all users with Chief Admin role for a given company"""

        return UserRepository.get_users_by_role(company, 'Chief Admin')

    @staticmethod
    def get_service_managers_for_company(company):
        """Get all users with Service Manager role for a given company"""

        return UserRepository.get_users_by_role(company, 'Service Manager')

    @staticmethod
    def get_users_by_role(company, role_name):
        """Get all users with a specific role for a given company"""
        try:
            role = Role.objects.filter(
                company=company,
                name=role_name,
                is_active=True
            ).first()

            if not role:
                logger.warning(f"No role '{role_name}' found for company: {company.name}")
                return []

            user_company_roles = UserCompanyRole.objects.filter(
                company=company,
                role=role,
                is_active=True
            ).select_related('user')

            users = [ucr.user for ucr in user_company_roles if ucr.user.is_active]
            return users
        except Exception as e:
            logger.error(f"Error getting users with role '{role_name}' for company {company.name}: {str(e)}")
            return []

    @staticmethod
    def get_by_id(user_id):
        return UserRepository.get_queryset().get(id=user_id)
