from django.core.management.base import BaseCommand
from extractly.models import NetworkMonitoredPage
from bs4 import BeautifulSoup


def find_elements_by_css_class(html: str, target_class: str) -> list:
    soup = BeautifulSoup(html or "", "html.parser")
    results = []

    for tag in soup.find_all(class_=target_class):
        tag_name = tag.name
        attributes = tag.attrs or {}
        data_attrs = {k: v for k, v in attributes.items() if k.startswith("data-")}
        class_list = tag.get("class", [])
        results.append({
            "tag": tag_name,
            "data_attrs": data_attrs,
            "class": class_list,
            "full_html": str(tag)[:500] + "..."  # skrót
        })

    return results


class Command(BaseCommand):
    help = "Znajduje elementy z podaną klasą CSS (np. 'css-xxxx') i wypisuje data-* oraz selektor CSS."

    def add_arguments(self, parser):
        parser.add_argument('--id', type=int, required=True, help="ID rekordu NetworkMonitoredPage")
        parser.add_argument('--class-name', type=str, required=True, help="Nazwa klasy CSS do znalezienia, np. 'css-1looqia'")

    def handle(self, *args, **options):
        obj_id = options['id']
        class_name = options['class_name']

        try:
            obj = NetworkMonitoredPage.objects.get(id=obj_id)
        except NetworkMonitoredPage.DoesNotExist:
            self.stdout.write(self.style.ERROR(f"❌ Nie znaleziono rekordu ID={obj_id}"))
            return

        html = obj.html
        if not html:
            self.stdout.write(self.style.WARNING("⚠️ Brak HTML w tym rekordzie."))
            return

        found = find_elements_by_css_class(html, class_name)

        if not found:
            self.stdout.write("❌ Nie znaleziono żadnych elementów z podaną klasą.")
            return

        for i, el in enumerate(found, 1):
            self.stdout.write(f"\n#{i} <{el['tag']} class=\"{' '.join(el['class'])}\">")
            for key, value in el['data_attrs'].items():
                self.stdout.write(f"  {key} = \"{value}\"")

            if el['data_attrs']:
                selector_parts = [el["tag"]] + [
                    f'[{k}="{v}"]' for k, v in el["data_attrs"].items()
                ]
                selector = ''.join(selector_parts)
                self.stdout.write(self.style.SUCCESS(f"  🔎 Propozycja selektora: {selector}"))
            else:
                self.stdout.write(self.style.WARNING("  ⚠️ Brak data-* atrybutów – selektor może być mało precyzyjny."))
