from django.core.management.base import BaseCommand
from extractly.models import NetworkMonitoredPage
from html_agregator.utils.schema_finder import SchemaAnalyzer


class Command(BaseCommand):
    """
    ASCII-preview & fingerprint of (optionally sliced) HTML stored
    in NetworkMonitoredPage.

    Examples
    --------
    # pełny HTML
    python manage.py schema_finder 12804

    # użyj pola sliced_html i skróć drzewo do głębokości 6
    python manage.py schema_finder 12804 --slice --depth 6
    """

    help = "Visualise DOM structure for a NetworkMonitoredPage row"

    # ───────────────── argparse ─────────────────
    def add_arguments(self, parser):
        parser.add_argument("page_id", type=int, help="PK of NetworkMonitoredPage")
        parser.add_argument(
            "--slice",
            action="store_true",
            help="Render page.sliced_html instead of raw page.html",
        )
        parser.add_argument("--depth", type=int, default=None, help="max recursion depth")
        parser.add_argument("--repeat", type=int, default=3, help="min repetition")
        parser.add_argument("--blob", type=int, default=120, help="min blob length")
        parser.add_argument(
            "--compact",
            action="store_true",
            help="Print only compact fingerprint (no ASCII preview)",
        )

    # ───────────────── handle ───────────────────
    def handle(self, page_id, **opts):
        page: NetworkMonitoredPage = NetworkMonitoredPage.objects.get(pk=page_id)

        # wybór źródła HTML
        html_src = page.sliced_html if opts["slice"] and page.sliced_html else page.html

        sa = SchemaAnalyzer(
            html_src,
            max_depth=opts["depth"],
            min_repeat=opts["repeat"],
            min_blob_len=opts["blob"],
        )

        if opts["compact"]:
            self.stdout.write(sa.compact_fingerprint)
        else:
            self.stdout.write(sa.pretty_ascii())
            self.stdout.write(
                self.style.SUCCESS(f"fingerprint: {sa.compact_fingerprint}")
            )
