from rest_framework import serializers
from django.contrib.auth import get_user_model
from apps.companies.models import CallCatchPhrase
from apps.calls.models import Call
from apps.userprofile.services import ProfileServices

User = get_user_model()


class CallPhraseReportSerializer(serializers.ModelSerializer):
    id = serializers.IntegerField(source='pk')
    call_id = serializers.CharField()
    twilio_call_id = serializers.CharField(source="twilio_call_sid")
    summary = serializers.CharField()
    call_date_time = serializers.DateTimeField(source='created_at')
    customer_name = serializers.CharField(source='caller_name')
    customer_phone = serializers.CharField(source='from_number')

    transcript = serializers.SerializerMethodField()

    catch_phrases_found = serializers.SerializerMethodField()
    catch_phrases_found_detail = serializers.SerializerMethodField()
    advisor = serializers.SerializerMethodField()

    def get_transcript(self, obj):
        return ""

    def _get_call_phrases(self, call):
        if not hasattr(call, "_prefetched_catch_phrases"):
            call._prefetched_catch_phrases = (
                CallCatchPhrase.objects
                .filter(call=call)
                .select_related("phrase")
            )
        return call._prefetched_catch_phrases

    def get_catch_phrases_found(self, call):
        return [
            cp.phrase.phrase
            for cp in self._get_call_phrases(call)
        ]

    def get_catch_phrases_found_detail(self, call):
        return [
            {
                "phrase_id": cp.phrase_id,
                "phrase": cp.phrase.phrase,
                "speaker": cp.speaker,
                "confidence": cp.confidence,
                "source": cp.source,
                "matched_text": cp.matched_text,
            }
            for cp in self._get_call_phrases(call)
        ]

    def get_advisor(self, call):
        advisor = call.transfer_user
        if not advisor:
            return self.return_empty()

        return {
            "id": advisor.id,
            "name": ProfileServices.display_name_for_company(advisor, call.company),
            "phone": call.transfer_number,
        }

    def return_empty(self):
        return {"id": None, "name": 'Not Transferred', "phone": None}

    class Meta:
        model = Call
        fields = [
            "id",
            "call_id",
            "twilio_call_id",
            "summary",
            "call_date_time",
            "customer_name",
            "customer_phone",
            "transcript",
            "catch_phrases_found",
            "catch_phrases_found_detail",
            "advisor",
        ]
