from django.db.models import Exists, OuterRef

from apps.access.authorization import authorized_queryset
from apps.organization.models import Company, ServiceCenter
from apps.service.models import ServiceCase, ServiceEngineerAssignment
from apps.commercial.models import InvoiceLine, QuotationLine
from apps.inventory.queries import authorized_locations

from .permissions import EXPORT


def centers(user, permission, *, export=False):
    rows = authorized_queryset(user=user, permission=permission, queryset=ServiceCenter.objects.all())
    if export:
        rows = authorized_queryset(user=user, permission=EXPORT, queryset=rows)
    return rows


def companies(user, permission, *, export=False):
    rows = authorized_queryset(user=user, permission=permission, queryset=Company.objects.all())
    return authorized_queryset(user=user, permission=EXPORT, queryset=rows) if export else rows


def locations(user, permission, filters, *, export=False):
    rows = authorized_locations(actor=user, permission=permission)
    if export:
        rows = rows.filter(pk__in=authorized_locations(actor=user, permission=EXPORT).values("pk"))
    for key, field in (("company", "company_id"), ("region", "service_center__region_id"), ("service_center", "service_center_id")):
        if filters.get(key):
            rows = rows.filter(**{field: filters[key]})
    return rows


def cases(user, permission, filters, *, export=False):
    rows = ServiceCase.objects.filter(service_center_id__in=centers(user, permission, export=export).values("pk"))
    fields = {"company": "company_id", "region": "service_center__region_id", "service_center": "service_center_id",
              "brand": "device__product_model__brand_id", "product_category": "device__product_model__category_id",
              "model": "device__product_model_id", "variant": "device__product_variant_id", "case": "pk",
              "status": "status", "intake_channel": "intake_channel"}
    for key, field in fields.items():
        if filters.get(key):
            rows = rows.filter(**{field: filters[key]})
    if filters.get("engineer"):
        rows = rows.filter(Exists(ServiceEngineerAssignment.objects.filter(service_case_id=OuterRef("pk"), engineer_id=filters["engineer"], ended_at=None)))
    if filters.get("warranty"):
        rows = rows.filter(warranty_snapshot__recorded_coverage=filters["warranty"] == "covered")
    if filters.get("responsibility"):
        invoice = InvoiceLine.objects.filter(invoice__service_case_id=OuterRef("pk"), invoice__status="FINALIZED", is_active=True, responsibility=filters["responsibility"])
        quote = QuotationLine.objects.filter(quotation__family__service_case_id=OuterRef("pk"), quotation__is_current=True, is_active=True, responsibility=filters["responsibility"])
        rows = rows.filter(Exists(invoice) | Exists(quote))
    return rows
