from rest_framework import serializers
from job.models import Job, JobPosting
from job.emails import send_job_posting_email


class JobPostingSerializer(serializers.ModelSerializer):
    class Meta:
        model = JobPosting
        fields = ('id', 'CompanyName', 'CompanyCountry', 'workEmail', 'startDate', 'requirements', 'hiring_type', 'status')


class JobSerializer(serializers.ModelSerializer):
    class Meta:
        model = Job
        fields = ('id', 'slug', 'title', 'seniority', 'monthlyBudget', 'Tags', 'CompanyName', 'CompanyCountry', 'workEmail', 'startDate', 'requirements', 'meta_title', 'meta_description', 'og_title', 'og_description', 'og_image', 'og_image_alt', 'status', 'created_at')
        read_only_fields = ('id', 'slug', 'meta_title', 'meta_description', 'created_at')


class JobCreateSerializer(serializers.Serializer):
    """
    Serializer for creating jobs (single or multiple hires)
    """
    hiring_type = serializers.ChoiceField(choices=['single', 'multiple'], default='single')
    CompanyName = serializers.CharField(max_length=255)
    CompanyCountry = serializers.CharField(max_length=100)
    workEmail = serializers.EmailField()
    startDate = serializers.CharField(max_length=100)
    requirements = serializers.CharField(required=True)
    status = serializers.BooleanField(default=False)
    
    # For single hire
    title = serializers.CharField(max_length=255, required=False)
    seniority = serializers.CharField(max_length=100, required=False)
    monthlyBudget = serializers.CharField(max_length=100, required=False)
    Tags = serializers.ListField(child=serializers.CharField(), required=False)
    
    # For multiple hire
    positions = serializers.ListField(
        child=serializers.DictField(),
        required=False,
        help_text="Array of positions for multiple hire"
    )
    
    def validate(self, data):
        hiring_type = data.get('hiring_type')
        
        if hiring_type == 'single':
            if not all([data.get('title'), data.get('seniority'), data.get('monthlyBudget')]):
                raise serializers.ValidationError("title, seniority, and monthlyBudget are required for single hire")
        elif hiring_type == 'multiple':
            if not data.get('positions'):
                raise serializers.ValidationError("positions array is required for multiple hire")
            if not isinstance(data.get('positions'), list) or len(data.get('positions')) == 0:
                raise serializers.ValidationError("positions must be a non-empty array")
        
        return data
    
    def create(self, validated_data):
        hiring_type = validated_data.pop('hiring_type')
        company_data = {
            'CompanyName': validated_data.pop('CompanyName'),
            'CompanyCountry': validated_data.pop('CompanyCountry'),
            'workEmail': validated_data.pop('workEmail'),
            'startDate': validated_data.pop('startDate'),
            'requirements': validated_data.pop('requirements'),
            'status': validated_data.pop('status'),
        }
        
        jobs = []
        
        if hiring_type == 'single':
            # Create single job
            job = Job.objects.create(
                title=validated_data.pop('title'),
                seniority=validated_data.pop('seniority'),
                monthlyBudget=validated_data.pop('monthlyBudget'),
                Tags=validated_data.pop('Tags', []),
                **company_data
            )
            jobs.append(job)
        
        elif hiring_type == 'multiple':
            # Create JobPosting parent
            job_posting = JobPosting.objects.create(
                hiring_type='multiple',
                **company_data
            )
            
            # Create multiple Job records
            positions = validated_data.pop('positions')
            for position in positions:
                job = Job.objects.create(
                    job_posting=job_posting,
                    title=position.get('title'),
                    seniority=position.get('seniority'),
                    monthlyBudget=position.get('monthlyBudget'),
                    Tags=position.get('Tags', []),
                    **company_data
                )
                jobs.append(job)
        
        # Send email notifications
        send_job_posting_email(jobs, hiring_type)
        
        return jobs if len(jobs) > 1 else jobs[0]
