"""Company isolation is not caller authorization. Results are lazy snapshots."""
from django.db.models import Q

from apps.organization.models import Company
from .models import Customer, normalize_mobile
from django.core.exceptions import ValidationError


def active_customers_for_company(company):
    if not isinstance(company, Company) or company._state.adding or company._state.db != "default":
        return Customer.objects.none()
    return Customer.objects.filter(company_id=company.pk, company__is_active=True, is_active=True)


def find_customers(*, company, query):
    customers = active_customers_for_company(company)
    if not isinstance(query, str) or not query.strip():
        return customers.none()
    query = query.strip()
    match = Q()
    for field in ("customer_number", "full_name", "organization_name", "primary_mobile", "primary_email"):
        match |= Q(**{field + "__icontains": query})
    try:
        mobile = normalize_mobile(query)
    except ValidationError:
        pass
    else:
        match |= Q(primary_mobile__icontains=mobile)
    return customers.filter(match)


def _active_details(customer, model):
    if not isinstance(customer, Customer) or customer._state.adding or customer._state.db != "default":
        return model.objects.none()
    return model.objects.filter(customer_id=customer.pk, customer__is_active=True,
                                customer__company__is_active=True, is_active=True)


def active_addresses_for_customer(customer):
    from .models import CustomerAddress
    return _active_details(customer, CustomerAddress)


def primary_address_for_customer(customer):
    return active_addresses_for_customer(customer).filter(is_primary=True).first()


def active_contacts_for_customer(customer, *, contact_type=None):
    from .models import CustomerContact
    queryset = _active_details(customer, CustomerContact)
    if contact_type is not None:
        if contact_type not in CustomerContact.Type.values:
            return queryset.none()
        queryset = queryset.filter(contact_type=contact_type)
    return queryset


def primary_contact_for_customer(customer, *, contact_type):
    from .models import CustomerContact
    if contact_type not in CustomerContact.Type.values:
        return None
    return active_contacts_for_customer(customer, contact_type=contact_type).filter(is_primary=True).first()
