from django.core.management.base import BaseCommand
from extractly.models import NetworkMonitoredPage
from html_agregator.html_fetcher import fetch_and_save_html_for_pages
from html_agregator.utils.process import get_pages_to_process
from asgiref.sync import sync_to_async
import asyncio

class Command(BaseCommand):
    help = "Pobiera HTML stron z NetworkMonitoredPage według filtrów lub konkretnego ID"

    def add_arguments(self, parser):
        parser.add_argument('--id', type=int, help="ID konkretnego NetworkMonitoredPage")
        parser.add_argument('--enable', choices=['true', 'false', 'all'], default='true')
        parser.add_argument('--name', nargs='*')
        parser.add_argument('--headless', action='store_true', default=False)
        parser.add_argument('--include-fetched', action='store_true', default=False)

    def handle(self, *args, **options):
        id_ = options['id']
        enable = options['enable']
        names = options['name']
        headless = options['headless']
        include_fetched = options['include_fetched']

        async def runner():
            from playwright.async_api import async_playwright

            if id_:
                try:
                    obj = await sync_to_async(NetworkMonitoredPage.objects.get)(id=id_)
                    pages = [obj]
                except NetworkMonitoredPage.DoesNotExist:
                    self.stderr.write(f"Brak NetworkMonitoredPage o id={id_}")
                    return
            else:
                pages_qs = await get_pages_to_process(
                    enable=enable,
                    name=names,
                    include_fetched=include_fetched,
                )
                pages = await sync_to_async(list)(pages_qs)
                print(f"Do pobrania: {len(pages)} stron")

            async with async_playwright() as p:
                browser = await p.chromium.launch(
                    headless=headless,
                    args=[
                        "--disable-blink-features=AutomationControlled",
                        "--no-sandbox",
                        "--disable-dev-shm-usage",
                    ],
                )
                context = await browser.new_context(
                    user_agent=(
                        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
                        "(KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"
                    ),
                    locale="pl-PL",
                    timezone_id="Europe/Warsaw",
                    viewport={"width": 1366, "height": 768},
                    extra_http_headers={
                        "Accept-Language": "pl-PL,pl;q=0.9,en;q=0.8",
                        "Upgrade-Insecure-Requests": "1",
                    },
                )
                # prosty stealth
                await context.add_init_script("""
                Object.defineProperty(Navigator.prototype, 'webdriver', { get: () => undefined });
                window.chrome = window.chrome || { runtime: {} };
                Object.defineProperty(navigator, 'languages', { get: () => ['pl-PL','pl'] });
                Object.defineProperty(navigator, 'plugins',  { get: () => [1,2,3,4,5] });
                """)

                page = await context.new_page()
                await fetch_and_save_html_for_pages(page, pages=pages)
                await browser.close()

        asyncio.run(runner())
