"""Exact historical identity lookup versus current operational catalog filtering."""
from .relationship_queries import (  # noqa: F401
    current_device_owner, current_ownership_relationship, device_ownership_history,
    currently_owned_devices, currently_owned_devices_for_company,
)
from django.core.exceptions import ValidationError
from django.db.models import Q

from apps.catalog.models import ProductModel
from .identification import identity_key
from .models import Device, DeviceIdentifier


def find_device_by_identifier(value):
    try:
        key = identity_key(value)
    except ValidationError:
        return None
    record = DeviceIdentifier.objects.select_related("device", "device__product_model", "device__product_model__brand").filter(identity_key=key).first()
    return record.device if record else None


def identifier_history_for_device(device):
    if not isinstance(device, Device) or device._state.adding or device._state.db != "default":
        return DeviceIdentifier.objects.none()
    return DeviceIdentifier.objects.filter(device_id=device.pk)


def active_identifiers_for_device(device):
    # "Active" means current identifier slots, even when the Device is inactive.
    return identifier_history_for_device(device).filter(is_active=True)


def active_devices_for_product_model(product_model):
    if not isinstance(product_model, ProductModel) or product_model._state.adding or product_model._state.db != "default":
        return Device.objects.none()
    return Device.objects.filter(product_model_id=product_model.pk, is_active=True,
        product_model__is_active=True, product_model__brand__is_active=True,
        product_model__category__is_active=True).filter(Q(product_variant__isnull=True) | Q(product_variant__is_active=True))


def _evidence_rows(device, model):
    if not isinstance(device, Device) or device._state.adding or device._state.db != "default":
        return model.objects.none()
    return model.objects.filter(device_id=device.pk)


def get_device_purchase_evidence(device):
    from .models import DevicePurchaseEvidence
    return _evidence_rows(device, DevicePurchaseEvidence).first()


def warranty_coverage_history(device):
    from .models import DeviceWarrantyCoverage
    return _evidence_rows(device, DeviceWarrantyCoverage)


def current_warranty_coverage(device):
    return warranty_coverage_history(device).filter(is_active=True).first()


def device_has_recorded_warranty_coverage(*, device, on_date):
    from datetime import date, datetime
    if not isinstance(on_date, date) or isinstance(on_date, datetime):
        raise ValidationError("Supply an explicit date, not a timestamp.")
    # This is an inclusive recorded-period fact, not approval of a repair claim.
    return warranty_coverage_history(device).filter(is_active=True, device__is_active=True,
        coverage_start_date__lte=on_date, coverage_end_date__gte=on_date).exists()
