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()
    
    class Meta:
        model = User
        fields = ['id', 'username', 'email', 'user_type', 'is_available', 'profile', 'company', 'companies_count', 'company_role', 'company_permissions', 'must_change_password']
    
    # 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,
            }
        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
        ]


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

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