from rest_framework import serializers
from django.contrib.auth.models import User
from .models import Request, RequestType, WorkLog, Project, UserProfile, Attendance, TaskType

# --- سریالایزر استاندارد کاربر (User) ---
class UserSerializer(serializers.ModelSerializer):
    full_name = serializers.SerializerMethodField()

    class Meta:
        model = User
        fields = ['id', 'username', 'first_name', 'last_name', 'email', 'full_name']
    
    def get_full_name(self, obj):
        return f"{obj.first_name} {obj.last_name}"


# 1. سریالایزر پروژه‌ها
class ProjectSerializer(serializers.ModelSerializer):
    class Meta:
        model = Project
        fields = '__all__'


# 2. سریالایزر پروفایل کاربر
class UserProfileSerializer(serializers.ModelSerializer):
    user_info = UserSerializer(source='user', read_only=True)
    
    # اضافه کردن فیلد سفارشی برای خواندن عنوان سطح از اپلیکیشن Scoring
    level_title = serializers.SerializerMethodField()

    class Meta:
        model = UserProfile
        fields = '__all__' # یا لیست فیلدها شامل level_title
        read_only_fields = ['user']

    def get_level_title(self, obj):
        # تلاش برای دسترسی به پروفایل امتیازی کاربر
        if hasattr(obj.user, 'scoring_profile') and obj.user.scoring_profile.scoring_level:
            return obj.user.scoring_profile.scoring_level.title
        return "کارمند عادی"


# 3. سریالایزر گزارش کارها
class TaskTypeSerializer(serializers.ModelSerializer):
    class Meta:
        model = TaskType
        fields = '__all__'
        
class WorkLogSerializer(serializers.ModelSerializer):
    project_title = serializers.ReadOnlyField(source='project.title')
    task_type_title = serializers.ReadOnlyField(source='task_type.title')
    user_full_name = serializers.SerializerMethodField()
    
    # فیلدهایی که از Propertyهای مدل خوانده می‌شوند
    actual_minutes = serializers.ReadOnlyField(source='actual_minutes_display')
    efficiency_percentage = serializers.ReadOnlyField() 
    efficiency = serializers.ReadOnlyField() # اگر هنوز در مدل فیلدی به این نام داری

    class Meta:
        model = WorkLog
        fields = '__all__'
        read_only_fields = (
            'user', 'created_date', 'status', 'start_time', 'end_time', 
            'actual_minutes', 'efficiency', 'user_full_name', 
            'efficiency_percentage',
            'pause_duration',
        )

    def get_user_full_name(self, obj):
        full_name = obj.user.get_full_name()
        return full_name if full_name.strip() else obj.user.username

    def create(self, validated_data):
        task_type = validated_data.get('task_type')
        user_estimated = validated_data.get('estimated_minutes', 0)

        if task_type:
            if task_type.standard_duration > 0:
                validated_data['estimated_minutes'] = task_type.standard_duration
            else:
                validated_data['estimated_minutes'] = user_estimated
        else:
            validated_data['estimated_minutes'] = user_estimated
        
        return super().create(validated_data)


# 4. سریالایزر درخواست‌ها
class RequestTypeSerializer(serializers.ModelSerializer):
    class Meta:
        model = RequestType
        fields = '__all__'
        
class RequestSerializer(serializers.ModelSerializer):
    request_type_title = serializers.ReadOnlyField(source='request_type.title')
    
    class Meta:
        model = Request
        fields = '__all__'
        read_only_fields = ('user', 'status', 'is_approved', 'created_at')


# 5. سریالایزر حضور و غیاب
class AttendanceSerializer(serializers.ModelSerializer):
    duration_display = serializers.ReadOnlyField()
    is_active = serializers.ReadOnlyField()

    class Meta:
        model = Attendance
        fields = ['id', 'date', 'first_clock_in', 'last_clock_out', 'current_session_start', 'total_seconds', 'duration_display', 'is_active']
        read_only_fields = ['user', 'date', 'total_seconds']