from django.db.models import Prefetch

from .models import GoodsReceipt, GoodsReceiptLine, StockTransfer, StockTransferLine
from .queries import authorized_locations


def goods_receipts(*, actor):
    return GoodsReceipt.objects.filter(destination_id__in=authorized_locations(actor=actor).values("pk")).select_related(
        "company", "destination", "created_by", "received_by", "cancelled_by").order_by("company_id", "number")


def stock_transfers(*, actor):
    locations = authorized_locations(actor=actor).values("pk")
    # A transfer requires both endpoints' scope for document access and mutation.
    return StockTransfer.objects.filter(source_id__in=locations, destination_id__in=locations).select_related(
        "company", "source", "destination", "transit_location", "created_by", "dispatched_by", "received_by", "cancelled_by").order_by("company_id", "number")


def goods_receipt_detail(*, actor, receipt):
    return goods_receipts(actor=actor).prefetch_related(Prefetch("lines",
        queryset=GoodsReceiptLine.objects.select_related("spare_part", "movement").prefetch_related("identifiers__unit"))).get(pk=receipt.pk)


def stock_transfer_detail(*, actor, transfer):
    return stock_transfers(actor=actor).prefetch_related(Prefetch("lines",
        queryset=StockTransferLine.objects.select_related("spare_part", "dispatch_movement", "receive_movement").prefetch_related("units__unit"))).get(pk=transfer.pk)
