from rest_framework import serializers
from .models import *



class LeadContactSerializer(serializers.ModelSerializer):
    class Meta:
        model = LeadContact
        fields = ['id', 'lead', 'name', 'role', 'phone', 'email']
        read_only_fields = ['id']
        extra_kwargs = {'lead': {'required': False}}


class TaskSerializer(serializers.ModelSerializer):
    assigned_to_name = serializers.CharField(source='assigned_to.email', read_only=True, default=None)
    lead_company = serializers.CharField(source='lead.company_name', read_only=True)

    class Meta:
        model = Task
        fields = [
            'id', 'lead', 'lead_company', 'assigned_to', 'assigned_to_name',
            'title', 'description', 'due_date', 'status', 'priority', 'created_at',
        ]
        read_only_fields = ['id', 'created_at']


class PrimaryContactSerializer(serializers.ModelSerializer):
    class Meta:
        model = LeadContact
        fields = ['id', 'name', 'role', 'phone', 'email']


class LeadSerializer(serializers.ModelSerializer):
    assigned_to_name = serializers.CharField(source='assigned_to.email', read_only=True, default=None)
    contact_count = serializers.IntegerField(source='contacts.count', read_only=True)
    task_count = serializers.IntegerField(source='tasks.count', read_only=True)
    primary_contact = serializers.SerializerMethodField()

    def get_primary_contact(self, obj):
        contact = obj.contacts.first()
        return PrimaryContactSerializer(contact).data if contact else None

    class Meta:
        model = Lead
        fields = [
            'id', 'assigned_to', 'assigned_to_name',
            'research_date', 'vertical',
            'city', 'state', 'country',
            'company_name', 'website', 'google_maps_url', 'linkedin_url', 'instagram_url',
            'branches', 'google_reviews',
            'website_quality', 'seo_opportunity', 'chatbot_opportunity',
            'budget_fit', 'decision_speed', 'offer_fit',
            'personalization_note', 'priority_score', 'lead_tier',
            'current_stage', 'next_action', 'next_action_date', 'source',
            'status', 'notes',
            'contact_count', 'task_count', 'primary_contact',
            'created_at', 'updated_at',
        ]
        read_only_fields = ['id', 'created_by', 'created_at', 'updated_at']


class LeadDetailSerializer(LeadSerializer):
    contacts = LeadContactSerializer(many=True, read_only=True)
    tasks = TaskSerializer(many=True, read_only=True)

    class Meta(LeadSerializer.Meta):
        fields = LeadSerializer.Meta.fields + ['contacts', 'tasks']


class CSVImportSerializer(serializers.Serializer):
    file = serializers.FileField()


class EmailTemplateSerializer(serializers.ModelSerializer):
    class Meta:
        model = EmailTemplate
        fields = ['id', 'name', 'subject', 'body', 'created_by', 'created_at', 'updated_at']
        read_only_fields = ['id', 'created_by', 'created_at', 'updated_at']


class EmailSequenceStepSerializer(serializers.ModelSerializer):
    template_name = serializers.CharField(source='template.name', read_only=True)

    class Meta:
        model = EmailSequenceStep
        fields = ['id', 'sequence', 'step_number', 'template', 'template_name', 'delay_days']
        read_only_fields = ['id']


class EmailSequenceSerializer(serializers.ModelSerializer):
    steps = EmailSequenceStepSerializer(many=True, read_only=True)

    class Meta:
        model = EmailSequence
        fields = ['id', 'name', 'description', 'created_by', 'steps', 'created_at']
        read_only_fields = ['id', 'created_by', 'created_at']


class BatchLeadSerializer(serializers.ModelSerializer):
    lead_company = serializers.CharField(source='lead.company_name', read_only=True)

    class Meta:
        model = BatchLead
        fields = ['id', 'batch', 'lead', 'lead_company', 'email', 'current_step',
                  'replied', 'replied_at', 'unsubscribed', 'completed', 'last_email_sent_at']
        read_only_fields = ['id', 'current_step', 'replied_at', 'completed', 'last_email_sent_at']


class BatchSerializer(serializers.ModelSerializer):
    lead_ids = serializers.ListField(child=serializers.IntegerField(), write_only=True)
    total_leads = serializers.IntegerField(source='batch_leads.count', read_only=True)
    sequence_name = serializers.CharField(source='sequence.name', read_only=True)

    class Meta:
        model = Batch
        fields = ['id', 'name', 'sequence', 'sequence_name', 'status',
                  'lead_ids', 'total_leads', 'created_by', 'created_at']
        read_only_fields = ['id', 'created_by', 'created_at']

    def create(self, validated_data):
        lead_ids = validated_data.pop('lead_ids')
        batch = Batch.objects.create(**validated_data)
        for lead_id in lead_ids:
            try:
                lead = Lead.objects.get(id=lead_id)
                contact = LeadContact.objects.filter(lead=lead).exclude(email='').first()
                email = contact.email if contact else ''
                if email:
                    BatchLead.objects.create(batch=batch, lead=lead, email=email)
            except Lead.DoesNotExist:
                pass
        return batch


class EmailLogSerializer(serializers.ModelSerializer):
    class Meta:
        model = EmailLog
        fields = ['id', 'batch_lead', 'template', 'step_number', 'to_email',
                  'subject', 'status', 'mailgun_message_id', 'sent_at', 'error']
        read_only_fields = ['id', 'batch_lead', 'template', 'step_number', 'to_email',
                            'subject', 'status', 'mailgun_message_id', 'sent_at', 'error']
