# html_agregator/tasks.py

import asyncio
from celery import shared_task
from asgiref.sync import sync_to_async
from playwright.async_api import async_playwright
from celery import shared_task, chain
from abstractclass.tasks import clear_cache_task   

from html_agregator.html_fetcher import fetch_and_save_html_for_pages
from manual_agregator.tasks import task_process_manual   # <-- będzie użyte w nast. kroku
from html_agregator.utils.process import get_pages_to_process

# --- wspólne ustawienia "stealth" dla Playwrighta ---
PLAYWRIGHT_ARGS = [
    "--disable-blink-features=AutomationControlled",
    "--no-sandbox",
    "--disable-dev-shm-usage",
]
CTX_KW = dict(
    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",
    },
)
STEALTH_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] });
"""


LOCK_KEY = "html_aggr_lock"
LOCK_TTL = 20 * 60  # 20 min


@shared_task(name="html_agregator.fetch_pages", queue="html")
def html_agregator_task(previous_task_result=None, *, enable="true", names=None, include_fetched=False, auto_queue_next=True):
    async def runner():
        try:
            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"[html_agregator_task] Do pobrania: {len(pages)} stron")

            async with async_playwright() as p:
                browser = await p.chromium.launch(headless=True, args=PLAYWRIGHT_ARGS)
                context = await browser.new_context(**CTX_KW)
                await context.add_init_script(STEALTH_INIT_SCRIPT)
                page = await context.new_page()
                await fetch_and_save_html_for_pages(page, pages=pages)
                await context.close()
                await browser.close()
        except Exception as e:
            print(f"Błąd w html_agregator_task: {e}")

    asyncio.run(runner())

    if auto_queue_next:
        chain(
            clear_cache_task.s(
                keys=["html_aggr_lock"],
                patterns=["manual_pipeline_lock:*"],
                clear_all=False,
                log_prefix="[html->manual] "
            ).set(queue="default"),                      # 👈 czyść cache na default
            task_process_manual.s(
                mode="pipeline",
                limit=1000,
                name=None,
                only_id=None,
                dry_run=False,
                force=False,
                manual_id=None,
                force_names=None
            ).set(queue="manual")                        # 👈 manual parser na "manual"
        ).apply_async()

    return {"status": "ok", "queued_manual": bool(auto_queue_next)}