from django.core.management.base import BaseCommand
from manual_agregator.run_parser import process_manual_queue


class Command(BaseCommand):
    help = "Przetwarza zakolejkowane ogłoszenia z parse_data do NetworkMonitoringManual"

    def add_arguments(self, parser):
        parser.add_argument('--id', type=int, help="ID konkretnego NetworkMonitoredPage")
        parser.add_argument('--name', type=str, help="Filtruj po nazwie źródła (case-insensitive)")
        parser.add_argument('--limit', type=int, default=6000, help="Limit ogłoszeń do przetworzenia")
        parser.add_argument('--dry-run', action='store_true', help="Wyświetl dane bez zapisywania")
        parser.add_argument('--force', action='store_true', help="Ignoruj filtry is_complete/is_active/network_ad_manual (globalnie)")
        parser.add_argument(
            '--force-name',
            dest='force_names',
            help="Wymuś tryb 'force' tylko dla wybranych źródeł; podaj nazwy rozdzielone przecinkami "
                 "(porównywane case-insensitive do SourceManual.name lub source.title)."
        )

        active_group = parser.add_mutually_exclusive_group()
        active_group.add_argument('--only-active', action='store_true', help="Tylko is_active=True")
        active_group.add_argument('--only-inactive', action='store_true', help="Tylko is_active=False")

        # ⬇⬇ NOWE: filtrowanie po pustych polach
        parser.add_argument(
            '--only-empty',
            dest='only_empty_fields',
            help="Przetwarzaj tylko rekordy, gdzie któreś z podanych pól jest puste. "
                 "Lista pól po przecinku: price,title,description,address"
        )
        parser.add_argument(
            '--require-all-empty',
            action='store_true',
            help="Wymagaj, by wszystkie wskazane pola były puste (domyślnie: wystarczy którekolwiek)."
        )
        parser.add_argument(
            '--empty-include-zero',
            action='store_true',
            help="Traktuj 0 jako puste dla pól numerycznych (dotyczy price)."
        )
        # Enable description scraper (second-stage enrichment - fills only NULL/empty fields)
        parser.add_argument(
            '--use-description-scraper',
            action='store_true',
            help="WŁĄCZ ekstrakcję danych z opisu (description_extrator) - uzupełnia tylko puste pola, nie nadpisuje danych z parsera."
        )

    def handle(self, *args, **options):
        only_id = options.get('id')
        name_filter = options.get('name')
        limit = options.get('limit')
        dry_run = options.get('dry_run', False)

        raw_force_names = (options.get('force_names') or '').strip()
        force_names = {
            s.strip().lower()
            for s in raw_force_names.split(',')
            if s and s.strip()
        } or None

        # normalizacja listy pól
        raw_empty = (options.get('only_empty_fields') or '').strip()
        only_empty_fields = [
            f.strip().lower() for f in raw_empty.split(',') if f.strip()
        ] or None  # None => brak filtra

        # Description scraper is optional enhancement (only fills empty fields)
        if options.get('use_description_scraper'):
            self.stdout.write(self.style.SUCCESS("✓ Manual scraper (database settings): ENABLED"))
            self.stdout.write(self.style.SUCCESS("✓ Description scraper (description_extrator): ENABLED"))
            self.stdout.write("  → Description scraper will fill only NULL/empty fields")
        else:
            self.stdout.write(self.style.SUCCESS("✓ Manual scraper (database settings): ENABLED"))
            self.stdout.write(self.style.WARNING("✗ Description scraper: DISABLED"))

        count = process_manual_queue(
            limit=limit,
            name_filters=name_filter,
            only_id=only_id,
            dry_run=dry_run,
            force=options.get('force', False),
            force_names=force_names,
            only_active=options.get('only_active', False),
            only_inactive=options.get('only_inactive', False),
            # ⬇⬇ NOWE:
            only_empty_fields=only_empty_fields,
            require_all_empty=options.get('require_all_empty', False),
            empty_include_zero=options.get('empty_include_zero', False),
            # Enable description scraper (True = on, False = off)
            use_description_scraper=options.get('use_description_scraper', False),
        )

        self.stdout.write(self.style.SUCCESS(f"Przetworzono {count} ogłoszeń."))
