from django.contrib.auth.decorators import login_required
from django.core.exceptions import PermissionDenied
from django.core.paginator import Paginator
from django.db.models import Q
from django.shortcuts import get_object_or_404, render

from .models import Order


def _require_order_view_permission(user):
    if not user.is_authenticated or not user.is_active:
        raise PermissionDenied
    if not user.is_superuser and not user.has_perm("core.skv_view_orders"):
        raise PermissionDenied("You do not have permission to view orders.")



@login_required
def orders_list(request):
    _require_order_view_permission(request.user)

    orders = (
        Order.objects
        .select_related("customer", "assigned_to")
        .prefetch_related("items")
        .all()
    )

    query = (request.GET.get("q") or "").strip()[:120]
    status = (request.GET.get("status") or "").strip()
    valid_statuses = {value for value, _label in Order.Status.choices}

    if query:
        orders = orders.filter(
            Q(order_number__icontains=query)
            | Q(customer__name__icontains=query)
            | Q(customer__phone__icontains=query)
            | Q(customer__email__icontains=query)
            | Q(items__product_name__icontains=query)
            | Q(items__sku__icontains=query)
        ).distinct()

    if status in valid_statuses:
        orders = orders.filter(status=status)
    else:
        status = ""

    paginator = Paginator(orders, 25)
    page_obj = paginator.get_page(request.GET.get("page"))

    user = request.user

    return render(request, "orders/list.html", {
        "page_obj": page_obj,
        "orders": page_obj.object_list,
        "query": query,
        "selected_status": status,
        "status_choices": Order.Status.choices,
        "total_results": paginator.count,
        "can_view_orders": (
            user.is_superuser
            or user.has_perm("core.skv_view_orders")
        ),
        "can_view_dispatches": (
            user.is_superuser
            or user.has_perm("core.skv_view_dispatches")
        ),
        "can_view_payments": (
            user.is_superuser
            or user.has_perm("core.skv_view_payments")
        ),
        "can_view_catalogue": (
            user.is_superuser
            or user.has_perm("core.skv_view_catalogue")
        ),
    })


@login_required
def order_detail(request, order_id):
    _require_order_view_permission(request.user)
    order = get_object_or_404(
        Order.objects.select_related("customer", "assigned_to", "created_by")
        .prefetch_related("items", "invoice__payments"),
        pk=order_id,
    )
    can_accept = request.user.is_superuser or request.user.has_perm("core.skv_accept_orders")
    can_hold = request.user.is_superuser or request.user.has_perm("core.skv_hold_orders")
    can_decline = request.user.is_superuser or request.user.has_perm("core.skv_decline_orders")
    return render(request, "orders/detail.html", {
        "order": order,
        "can_accept": can_accept,
        "can_hold": can_hold,
        "can_decline": can_decline,
    })
