from django.core.management.base import BaseCommand
from django.db import transaction
from django.utils import timezone

from extractly.models import NetworkMonitoredPage, AdsManual


class Command(BaseCommand):
    help = (
        "Ustawia is_active=True i inactive_date=None jednocześnie na NetworkMonitoredPage i AdsManual.\n"
        "Domyślnie dotyczy TYLKO powiązanych par (przez OneToOne). Użyj --all, aby objąć wszystkie rekordy.\n"
        "Filtry pomocnicze: --source-id=<UUID>, --url-contains=<fragment>, oraz --dry-run."
    )

    def add_arguments(self, parser):
        parser.add_argument("--all", action="store_true",
                            help="Zaktualizuj wszystkie rekordy (nie tylko powiązane pary).")
        parser.add_argument("--source-id", type=str, default=None,
                            help="Ogranicz do jednego źródła (UUID SourceNetwork).")
        parser.add_argument("--url-contains", type=str, default=None,
                            help="Ogranicz do rekordów, których URL zawiera podany fragment.")
        parser.add_argument("--dry-run", action="store_true",
                            help="Pokaż plan zmian, ale nic nie zapisuj.")

    def handle(self, *args, **opts):
        do_all = opts["all"]
        source_id = opts.get("source_id")
        url_contains = opts.get("url_contains")
        dry = opts["dry_run"]

        # --- Budujemy QS dla stron ---
        if do_all:
            pages_qs = NetworkMonitoredPage.objects.all()
            manuals_qs = AdsManual.objects.all()
        else:
            # tylko powiązane pary
            pages_qs = NetworkMonitoredPage.objects.filter(network_ad_manual__isnull=False)
            manuals_qs = AdsManual.objects.filter(networkmonitoredpage__isnull=False)

        if source_id:
            pages_qs = pages_qs.filter(source_id=source_id)
            manuals_qs = manuals_qs.filter(networkmonitoredpage__source_id=source_id)

        if url_contains:
            pages_qs = pages_qs.filter(url__icontains=url_contains)
            manuals_qs = manuals_qs.filter(networkmonitoredpage__url__icontains=url_contains)

        # Aktualizujemy tylko te, które są nieaktywne
        pages_to_upd = pages_qs.filter(is_active=False)
        manuals_to_upd = manuals_qs.filter(is_active=False)

        pages_count = pages_to_upd.count()
        manuals_count = manuals_to_upd.count()

        if dry:
            self.stdout.write(
                f"[DRY-RUN] NetworkMonitoredPage do aktywacji: {pages_count}, "
                f"AdsManual do aktywacji: {manuals_count}"
            )
            return

        now = timezone.now()
        with transaction.atomic():
            if pages_count:
                pages_to_upd.update(is_active=True, inactive_date=None)
            if manuals_count:
                manuals_to_upd.update(is_active=True, inactive_date=None)

        self.stdout.write(
            self.style.SUCCESS(
                f"Aktywowano: NetworkMonitoredPage={pages_count}, AdsManual={manuals_count}"
            )
        )
