from rest_framework import serializers
from .models import Company, CollectiveAgreement, WorkingTimePolicy, VacationPolicy, OnboardingProgress

class CompanySerializer(serializers.ModelSerializer):
    class Meta:
        model = Company
        fields = ['id', 'name', 'industry', 'company_size', 'primary_location', 'operating_countries', 'api_endpoint', 'created_at', 'updated_at']

class CompanySearchSerializer(serializers.ModelSerializer):
    """Simple serializer for company search results"""
    class Meta:
        model = Company
        fields = ['id', 'name']

class CollectiveAgreementSerializer(serializers.ModelSerializer):
    class Meta:
        model = CollectiveAgreement
        fields = ['id', 'agreement_type', 'custom_name', 'organization', 'overtime_2h_rate', 'overtime_after_2h_rate', 
                 'night_work_rate', 'night_work_start', 'night_work_end', 'created_at', 'updated_at']

class WorkingTimePolicySerializer(serializers.ModelSerializer):
    assigned_users_count = serializers.SerializerMethodField()
    
    class Meta:
        model = WorkingTimePolicy
        fields = [
            'id', 'name', 'description', 'company', 'created_by',
            'monday_friday_start', 'monday_friday_end', 'saturday_start', 'saturday_end', 'sunday_start', 'sunday_end',
            'use_flextime', 'core_hours_start', 'core_hours_end',
            'flex_range_start', 'flex_range_end', 'max_flex_negative', 'max_flex_positive', 'use_time_banking',
            'max_bank_balance', 'overtime_conversion_daily', 'overtime_conversion_weekly', 'lunch_break_paid',
            'lunch_break_duration', 'lunch_break_required_after', 'short_break_required', 'short_break_duration_minutes',
            'short_break_required_after_hours', 'minimum_total_break_time_minutes',
            'enable_violation_monitoring', 'violation_notification_enabled', 'monitor_daily_violations',
            'monitor_weekly_violations', 'monitor_monthly_violations', 'monitor_missing_breaks',
            'violation_severity_warning_threshold', 'violation_severity_critical_threshold',
            'burnout_detection_enabled', 'burnout_notification_enabled', 'burnout_sensitivity',
            'overtime_weekends_rate', 'overtime_holidays_rate',
            'require_manager_approval', 'workers_self_register_overtime',
            'assigned_users_count', 'created_at', 'updated_at'
        ]
        read_only_fields = ['id', 'company', 'created_by', 'created_at', 'updated_at', 'assigned_users_count']
        extra_kwargs = {
            # Allow extra fields (like vacation policy fields) to pass through
        }
    
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # Allow extra fields to pass through validation
        self.fields = {**self.fields}
    
    def get_assigned_users_count(self, obj):
        """Return the number of users assigned to this policy"""
        return obj.assigned_users.count()
    
    def create(self, validated_data):
        """Set company and created_by from request context"""
        # These are set in perform_create, but we handle it here too for safety
        request = self.context.get('request')
        if request and request.user:
            validated_data['created_by'] = request.user
        # Company should be set from context or request
        if 'company' not in validated_data:
            if request and hasattr(request.user, 'company_id'):
                from .models import Company
                company = Company.objects.filter(id=request.user.company_id).first()
                if company:
                    validated_data['company'] = company
            else:
                # Fallback: get first company
                from .models import Company
                company = Company.objects.first()
                if company:
                    validated_data['company'] = company
        return super().create(validated_data)

class VacationPolicySerializer(serializers.ModelSerializer):
    class Meta:
        model = VacationPolicy
        fields = ['id', 'vacation_accrual_type', 'custom_accrual_rate', 'vacation_year_start', 'vacation_period_start',
                 'vacation_period_end', 'track_vacation_days', 'track_flex_time', 'track_time_bank', 'track_overtime_balance',
                 'track_toil', 'self_certification_days', 'sick_pay_percentage', 'include_finnish_holidays',
                 'include_swedish_holidays', 'created_at', 'updated_at']

class OnboardingProgressSerializer(serializers.ModelSerializer):
    class Meta:
        model = OnboardingProgress
        fields = ['id', 'current_step', 'is_completed', 'completed_at', 'created_at', 'updated_at']

class OnboardingDataSerializer(serializers.Serializer):
    """Combined serializer for all onboarding data"""
    company = CompanySerializer()
    collective_agreement = CollectiveAgreementSerializer(required=False)
    working_time_policy = WorkingTimePolicySerializer(required=False)
    vacation_policy = VacationPolicySerializer(required=False)
    onboarding_progress = OnboardingProgressSerializer(required=False)

class Step1CompanyProfileSerializer(serializers.Serializer):
    """Serializer for Step 1: Company Profile"""
    name = serializers.CharField(max_length=255)
    industry = serializers.ChoiceField(choices=Company.INDUSTRY_CHOICES)
    company_size = serializers.ChoiceField(choices=Company.COMPANY_SIZE_CHOICES)
    primary_location = serializers.CharField(max_length=255)
    operating_countries = serializers.ListField(child=serializers.CharField(max_length=2))

class Step2CollectiveAgreementSerializer(serializers.Serializer):
    """Serializer for Step 2: Collective Agreement"""
    agreement_type = serializers.ChoiceField(choices=CollectiveAgreement.AGREEMENT_TYPE_CHOICES)
    custom_name = serializers.CharField(max_length=255, required=False, allow_blank=True)
    organization = serializers.CharField(max_length=255, required=False, allow_blank=True)
    overtime_2h_rate = serializers.DecimalField(max_digits=5, decimal_places=2, required=False)
    overtime_after_2h_rate = serializers.DecimalField(max_digits=5, decimal_places=2, required=False)
    night_work_rate = serializers.DecimalField(max_digits=5, decimal_places=2, required=False)
    night_work_start = serializers.TimeField(required=False)
    night_work_end = serializers.TimeField(required=False)

class Step3WorkingTimePolicySerializer(serializers.Serializer):
    """Serializer for Step 3: Working Time Policy"""
    monday_friday_start = serializers.TimeField()
    monday_friday_end = serializers.TimeField()
    use_flextime = serializers.BooleanField(default=False)
    core_hours_start = serializers.TimeField(required=False)
    core_hours_end = serializers.TimeField(required=False)
    flex_range_start = serializers.TimeField(required=False)
    flex_range_end = serializers.TimeField(required=False)
    max_flex_negative = serializers.IntegerField(required=False)
    max_flex_positive = serializers.IntegerField(required=False)
    use_time_banking = serializers.BooleanField(default=False)
    max_bank_balance = serializers.IntegerField(required=False)
    overtime_conversion_daily = serializers.IntegerField(required=False)
    overtime_conversion_weekly = serializers.IntegerField(required=False)
    lunch_break_paid = serializers.BooleanField(default=True)
    lunch_break_duration = serializers.IntegerField(required=False)
    lunch_break_required_after = serializers.IntegerField(required=False)
    overtime_weekends_rate = serializers.DecimalField(max_digits=5, decimal_places=2, required=False)
    overtime_holidays_rate = serializers.DecimalField(max_digits=5, decimal_places=2, required=False)
    require_manager_approval = serializers.BooleanField(default=True)
    workers_self_register_overtime = serializers.BooleanField(default=False)

class Step4VacationPolicySerializer(serializers.Serializer):
    """Serializer for Step 4: Vacation Policy"""
    vacation_accrual_type = serializers.ChoiceField(choices=VacationPolicy.VACATION_ACCRUAL_CHOICES)
    custom_accrual_rate = serializers.DecimalField(max_digits=5, decimal_places=2, required=False)
    vacation_year_start = serializers.DateField()
    vacation_period_start = serializers.DateField()
    vacation_period_end = serializers.DateField()
    track_vacation_days = serializers.BooleanField(default=True)
    track_flex_time = serializers.BooleanField(default=True)
    track_time_bank = serializers.BooleanField(default=True)
    track_overtime_balance = serializers.BooleanField(default=True)
    track_toil = serializers.BooleanField(default=False)
    self_certification_days = serializers.IntegerField(required=False)
    sick_pay_percentage = serializers.IntegerField(required=False)
    include_finnish_holidays = serializers.BooleanField(default=True)
    include_swedish_holidays = serializers.BooleanField(default=False)
