"""
Serializers for recipe APIs
"""

import pytz
from django.utils import timezone
from rest_framework import serializers

from django.db.models import Avg

from apps.core.fields import LocalizedDateTimeField
from apps.customers.models import Customer
from apps.companies.models import Company
from apps.calls.models import Call, CallActivity
from apps.companies.serializers import DealershipCallSerializer, DealershipNameSerializer


class CallSerializer(serializers.ModelSerializer):
    """Serializer for calls."""

    class Meta:
        model = Call
        fields = [
            'id',
            'caller_name',
            'from_number',
            'to_number',
            'company',
            'status',
            'transcript',
            'duration',
            'cost',
            'call_id',
            'twilio_call_sid'
        ]
        read_only_fields = ['id']


class CustomerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Customer
        fields = ['name']


class CompanySerializer(serializers.ModelSerializer):
    class Meta:
        model = Company
        fields = ['id', 'name']


class CallActivitySerializer(serializers.ModelSerializer):
    user_fullname = serializers.SerializerMethodField()

    class Meta:
        model = CallActivity
        fields = ['user_fullname', 'action', 'performed_at', 'duration_played']

    def get_user_fullname(self, obj):
        profile = getattr(obj.user, 'profile', None)
        if profile:
            return f"{profile.first_name} {profile.last_name}"
        return None


class CallDetailSerializer(CallSerializer):
    """Serializer for call detail view."""
    created_at = LocalizedDateTimeField()
    company = CompanySerializer(read_only=True)
    customer = serializers.SerializerMethodField()
    transfer_user = serializers.SerializerMethodField()
    activities = serializers.SerializerMethodField()
    dealership = DealershipCallSerializer(read_only=True)

    class Meta(CallSerializer.Meta):
        fields = CallSerializer.Meta.fields + [
            'created_at',
            'read_at',
            'transfer_status',
            'sentiment',
            'summary',
            'twilio_call_sid',
            'customer',
            'transfer_user',
            'activities',
            'bot_type',
            'call_time_category',
            'dealership',
        ]

    def get_customer(self, obj):
        customer = Customer.objects.filter(phone=obj.from_number, company=obj.company).first()
        if customer:
            return CustomerSerializer(customer).data
        return None

    def get_transfer_user(self, obj):
        if obj.transfer_user:
            full_name = obj.transfer_user.username
            if hasattr(obj.transfer_user, 'profile') and obj.transfer_user.profile:
                first_name = obj.transfer_user.profile.first_name
                last_name = obj.transfer_user.profile.last_name
                if first_name or last_name:
                    full_name = f"{first_name} {last_name}".strip()

            return {
                "id": obj.transfer_user.id,
                "name": full_name,
            }
        return None

    def get_activities(self, obj):
        """Return activities ordered descending by performed_at."""
        activities = obj.activities.order_by('-performed_at')
        return CallActivitySerializer(activities, many=True).data


class SalesCallDetailSerializer(serializers.ModelSerializer):
    class Meta:
        model = Call
        fields = ['id', 'caller_name', 'from_number', 'sentiment', 'created_at']
        read_only_fields = ['id']


class SalesCallSerializer(SalesCallDetailSerializer):
    offtime = serializers.SerializerMethodField()
    name = serializers.SerializerMethodField()
    customer = serializers.SerializerMethodField()
    activities = serializers.SerializerMethodField()

    class Meta(SalesCallDetailSerializer.Meta):
        fields = SalesCallDetailSerializer.Meta.fields + [
            'offtime', 'name', 'activities', 'customer'
        ]

    def get_customer(self, obj):
        customer = Customer.objects.filter(phone=obj.from_number, company=obj.company).first()
        if customer:
            return CustomerSerializer(customer).data
        return None

    def get_name(self, obj):
        return obj.appointment_set.first().name if obj.appointment_set.first() else None

    def get_offtime(self, obj):
        return obj.appointment_set.first().offtime if obj.appointment_set.first() else 1

    def get_activities(self, obj):
        """Return activities ordered descending by performed_at."""
        activities = obj.activities.order_by('-performed_at')
        return CallActivitySerializer(activities, many=True).data

class TopRepeatedCallersSerializer(serializers.Serializer):
    limit = serializers.IntegerField(default=10, min_value=1, max_value=100)
    start_date = serializers.DateTimeField(required=True)
    end_date = serializers.DateTimeField(required=True)
    call_id = serializers.CharField(required=False)

    def validate(self, data):
        if data['end_date'] < data['start_date']:
            raise serializers.ValidationError("End date must be after start date")
        return data


class DateRangeSerializer(serializers.Serializer):
    start_date = serializers.DateTimeField(required=True)
    end_date = serializers.DateTimeField(required=True)

    def validate(self, data):
        start = data["start_date"]
        end = data["end_date"]

        if start > end:
            raise serializers.ValidationError("start_date must be <= end_date")

        return data


class ReadCallSerializer(serializers.Serializer):
    """Serializer for marking a call as read."""
    id = serializers.IntegerField(required=True)

    def validate_id(self, value):
        if value <= 0:
            raise serializers.ValidationError("ID must be a positive integer")
        return value
