"""Historical scoped lookups; no implicit lifecycle or authorization decisions."""
from django.db.models import Q

from apps.customers.models import Customer
from apps.devices.identification import identity_key
from apps.devices.models import Device
from apps.organization.models import Company, ServiceCenter
from django.core.exceptions import ValidationError
from .models import ServiceCase


def _saved(instance, model):
    return isinstance(instance, model) and not instance._state.adding and instance._state.db == "default"


def _rows():
    return ServiceCase.objects.select_related("company", "service_center", "customer", "device__product_model__brand", "created_by", "warranty_snapshot")


def service_cases_for_customer(customer):
    return _rows().filter(customer_id=customer.pk) if _saved(customer, Customer) else _rows().none()


def service_cases_for_device(device):
    return _rows().filter(device_id=device.pk) if _saved(device, Device) else _rows().none()


def service_cases_for_service_center(service_center):
    return _rows().filter(service_center_id=service_center.pk) if _saved(service_center, ServiceCenter) else _rows().none()


def active_service_cases_for_service_center(service_center):
    return service_cases_for_service_center(service_center).filter(status=ServiceCase.Status.RECEIVED)


def service_case_by_job_number(*, service_center, job_number):
    if not isinstance(job_number, str):
        return None
    return service_cases_for_service_center(service_center).filter(job_number=job_number.strip().upper()).first()


def search_service_cases(*, company, query):
    if not _saved(company, Company) or not isinstance(query, str) or not query.strip():
        return _rows().none()
    query = query.strip()
    match = Q(job_number__icontains=query) | Q(customer__customer_number__icontains=query) | Q(customer__full_name__icontains=query) | Q(customer__organization_name__icontains=query) | Q(customer_reference__icontains=query)
    try:
        key = identity_key(query)
    except ValidationError:
        pass
    else:
        match |= Q(device__identifiers__identity_key=key)
    return _rows().filter(company_id=company.pk).filter(match).distinct()
