import json
from django.core.management.base import BaseCommand
from django.core.serializers.json import DjangoJSONEncoder
from extractly.models import SourceManual

class Command(BaseCommand):
    help = "Eksportuje ManualDataSource do pliku JSON (domyślnie manual_data_sources.json)"

    def add_arguments(self, parser):
        parser.add_argument(
            '--output', '-o',
            default='manual_data_sources.json',
            help='Ścieżka do pliku wynikowego'
        )
        parser.add_argument(
            '--enabled-only',
            action='store_true',
            help='Eksportuj tylko rekordy z enable=True'
        )
        parser.add_argument(
            '--name',
            help='Filtruj ManualDataSource po nazwie (case-insensitive, contains)'
        )
        parser.add_argument(
            '--source-name',
            help='Filtruj po nazwie powiązanego NetworkSource (case-insensitive, contains)'
        )

    def handle(self, *args, **options):
        output_path = options['output']
        qs = SourceManual.objects.select_related('source', 'html_source')

        if options.get('enabled_only'):
            qs = qs.filter(enable=True)

        name_filter = options.get('name')
        if name_filter:
            qs = qs.filter(name__icontains=name_filter)

        src_name_filter = options.get('source_name')
        if src_name_filter:
            # Bezpiecznie obsłuż brak powiązania
            qs = qs.filter(source__name__icontains=src_name_filter)

        data = []

        for m in qs:
            ns = getattr(m, 'source', None)
            hs = getattr(m, 'html_source', None)

            # --- ManualDataSource (poziom 1)
            manual_dict = {
                'id': m.id,
                'title': m.title,
                'name': m.name,
                'enable': m.enable,
                'actions': m.actions,
                'rules': m.rules,
                'selectors': m.selectors,
                'transferred': m.transferred,  
                'inactive': m.inactive,
                'type': m.type,
                'source_id': getattr(m, 'source_id', None),
                'html_source_id': getattr(m, 'html_source_id', None),
            }

            # --- Skrót NetworkSource (poziom 2) — opcjonalny
            ns_dict = None
            if ns:
                ns_dict = {
                    'id': getattr(ns, 'id', None),
                    'title': getattr(ns, 'title', None),
                    'type': getattr(ns, 'type', None),
                    'name': getattr(ns, 'name', None),
                    'base_url': getattr(ns, 'base_url', None),
                    'structure': getattr(ns, 'structure', None),
                    'skip_when_less': getattr(ns, 'skip_when_less', None),
                    'params': getattr(ns, 'params', None),
                    'pagination': getattr(ns, 'pagination', None),
                    'selectors': getattr(ns, 'selectors', None),
                    'is_ai': getattr(ns, 'is_ai', None),
                    'enabled': getattr(ns, 'enabled', None),
                    'last_checked': ns.last_checked.isoformat() if getattr(ns, 'last_checked', None) else None,
                    'last_status': getattr(ns, 'last_status', None),
                    'created_at': ns.created_at.isoformat() if getattr(ns, 'created_at', None) else None,
                }

            # --- Skrót HtmlNetworkSource (poziom 2) — opcjonalny
            hs_dict = None
            if hs:
                hs_dict = {
                    'id': getattr(hs, 'id', None),
                    'type': getattr(hs, 'type', None),
                    'title': getattr(hs, 'title', None),
                    'name': getattr(hs, 'name', None),
                    'actions': getattr(hs, 'actions', None),
                    'selectors': getattr(hs, 'selectors', None),
                    # jeżeli chcesz, możesz dodać też hs.source_id itp.
                }

            data.append({
                'manual': manual_dict,
                'network_source': ns_dict,
                'html_source': hs_dict,
            })

        with open(output_path, 'w', encoding='utf-8') as f:
            json.dump(data, f, indent=2, ensure_ascii=False, cls=DjangoJSONEncoder)

        self.stdout.write(self.style.SUCCESS(
            f"Wyeksportowano {len(data)} ManualDataSource do pliku {output_path}"
        ))
