from django.db.models.functions import Coalesce, NullIf, Trim, Concat
from django.db.models import Q, OuterRef, Subquery, Value, CharField

from apps.customers.models import Customer


class CallSearchMixin:
    search_param = "search"

    def with_sort_name(self, queryset):

        customer_name_subquery = Customer.objects.filter(
            phone=OuterRef('from_number'),
            company=OuterRef('company'),
            name__isnull=False,
        ).exclude(name='').values('name')[:1]

        return queryset.annotate(
            sort_name=Coalesce(
                NullIf('caller_name', Value('')),
                Subquery(customer_name_subquery),
                Value('Unknown'),
                output_field=CharField()
            )
        )

    def with_sort_advisor_name(self, queryset):

        advisor_full_name = Trim(Concat(
            Coalesce('transfer_user__profile__first_name', Value('')),
            Value(' '),
            Coalesce('transfer_user__profile__last_name', Value('')),
        ))

        sort_advisor_name = Coalesce(
            NullIf(advisor_full_name, Value('')),
            Value('Unknown'),
        )

        return queryset.annotate(
            sort_advisor_name=sort_advisor_name
        )

    def apply_call_search(self, queryset):
        search = self.request.query_params.get(self.search_param)
        if not search:
            return queryset

        return queryset.filter(
            Q(sort_name__icontains=search)
            | Q(from_number__icontains=search)
            | Q(call_id__icontains=search)
            | Q(twilio_call_sid__icontains=search)
        )
