from rest_framework import serializers
from django.contrib.auth import get_user_model

from apps.userprofile.serializers import UserProfileSerializer
from apps.core.serializers.companyuserlist import PermissionSerializer


User = get_user_model()


class UserListDetailSerializer(serializers.ModelSerializer):
    profile = UserProfileSerializer(required=False)
    companies_count = serializers.SerializerMethodField()
    companies_with_roles = serializers.SerializerMethodField()


    class Meta:
        model = User
        fields = [
            'id', 'username', 'email', 'user_type', 'profile',
            'is_active', 'is_available', 'is_staff', 'last_login',
            'companies_count', 'companies_with_roles'
        ]

    def get_companies_count(self, obj):
        """Get count of companies user belongs to"""
        return getattr(obj, 'companies_count', obj.companies.count())

    def get_companies_with_roles(self, obj):
        """Get all companies and user's role in each company"""
        companies_data = []

        for company in obj.companies.all():
            # Get user's role in this company with error handling
            try:
                role = obj.get_role_in_company(company)
            except (TypeError, AttributeError):
                # Fallback if method signature is different
                role = None

            company_info = {
                'id': company.id,
                'name': company.name,
                'is_active': company.is_active,
                'role': None
            }

            if role:
                permissions = PermissionSerializer(role.permissions.filter(is_active=True), many=True).data

                company_info['role'] = {
                    'id': role.id,
                    'name': role.name,
                    'description': role.description,
                    'is_active': role.is_active,
                    'permissions': permissions
                }

            companies_data.append(company_info)

        return companies_data

class UserDetailSerializer(serializers.ModelSerializer):
    profile = UserProfileSerializer(required=False)
    # active_company_name = serializers.SerializerMethodField()
    companies_count = serializers.SerializerMethodField()
    company_role = serializers.SerializerMethodField()
    company_permissions = serializers.SerializerMethodField()
    company = serializers.SerializerMethodField()
    two_factor_required = serializers.SerializerMethodField()

    class Meta:
        model = User
        fields = [
            'id', 'username', 'email', 'user_type',
            'is_available',
            'must_change_password',
            'two_factor_required',
            'companies_count',
            'profile',
            'company',
            'company_role',
            'company_permissions',
        ]

    # def get_active_company_name(self, obj):
    #     """Get active company name for the user"""
    #     return obj.get_active_company_name()
    
    def get_companies_count(self, obj):
        """Get count of companies user belongs to"""
        return obj.companies.count()
    
    def get_company(self, obj):
        """Get active company for the user"""
        company = obj.get_active_company()
        if company:
            return {
                'id': company.id,
                'name': company.name,
                'company_type': company.company_type
            }
        return None
    
    def get_company_role(self, obj):
        """Get user's role in their active company"""
        if not obj.active_company:
            return None
            
        role = obj.get_role_in_company()
        if role:
            return {
                'id': role.id,
                'name': role.name,
                'description': role.description,
                'is_active': role.is_active
            }
        return None
    
    def get_company_permissions(self, obj):
        """Get user's permissions in their active company"""
        if not obj.active_company:
            return []
            
        permissions = obj.get_all_permissions()
        return [
            {
                'id': perm.id,
                'name': perm.name,
                'codename': perm.codename,
                'is_active': perm.is_active
            }
            for perm in permissions
        ]

    def get_two_factor_required(self, obj):
        """Check if two-factor authentication is required for the user"""
        two_factor = getattr(obj, "two_factor", None)
        return two_factor.is_enabled if two_factor else False

class UserBasicInfoSerializer(serializers.ModelSerializer):
    profile = UserProfileSerializer(required=False)

    class Meta:
        model = User
        fields = ['email', 'profile']
