from django.db.models import Q
from extractly.models import NetworkMonitoredPage, SourceNetwork

def get_flagged_pages(
    limit: int | None = None,
    *,
    source_id=None,
    source_name: str | None = None,
    order_by: str | None = "id",   # <--- NOWE
):
    """
    Zwraca NetworkMonitoredPage do aktywnego sprawdzenia:
    - page.check_active == True
    - lub powiązane Ads/AdsManual mają check_active == True
    Można ograniczyć do konkretnego Source (po id lub nazwie).
    Parametr `order_by` przyjmuje np.: "id", "-id", "created_at", "-created_at", "?"
      - "?" => losowa kolejność (ORDER BY RAND/?).
    """
    qs = NetworkMonitoredPage.objects.filter(
        Q(network_ad__check_active=True) |
        Q(network_ad_manual__check_active=True)
    )

    if source_id:
        qs = qs.filter(source_id=source_id)
    elif source_name:
        # najpierw exact (case-insensitive), potem partial
        src_qs = SourceNetwork.objects.filter(title__iexact=source_name)
        if not src_qs.exists():
            src_qs = SourceNetwork.objects.filter(title__icontains=source_name)
        qs = qs.filter(source__in=src_qs)

    # ordering
    if order_by == "?" or order_by == "random":
        qs = qs.order_by("?")
    elif order_by:
        qs = qs.order_by(order_by)
    else:
        qs = qs.order_by("id")

    return qs[:limit] if limit else qs
