from extractly.models import SourceHtml
from html_agregator.utils.selectors import raw_data_cleaner, process_selectors
from asgiref.sync import sync_to_async
from link_agregator.utils.logger import logger

async def process_single_page(obj, index: int, total: int, log_func=print):
    html = obj.html or ""
    if not html.strip():
        log_func(f"[{index}/{total}] ⏩ PUSTE html dla ID={obj.id}, pomijam.")
        return False

    try:
        html_config = None
        if obj.source_id:
            html_config = await sync_to_async(SourceHtml.objects.filter(source_id=obj.source_id).first)()
        if not html_config:
            logger.warning(f"[HTML_FETCH] Brak configu dla source_id={obj.source_id} (pomijam)")
            return False
    except Exception as e:
        logger.error(f"[CONFIG] Błąd przy pobieraniu configu dla ID={obj.id}: {e}")
        return False

    try:
        if html_config.selectors:
            await process_selectors(obj, None, html_config.selectors, html)
            await sync_to_async(obj.save)()
    except Exception as e:
        logger.warning(f"[SELECTORS] Błąd przy process_selectors dla ID={obj.id}: {e}")
        return False

    try:
        html_to_clean = obj.sliced_html or html
        cleaned = raw_data_cleaner(html_to_clean)

        obj.raw_data = cleaned.get("raw_text", "")
        obj.image_links = cleaned.get("image_links", [])
        obj.is_raw_data = True

        await sync_to_async(obj.save)()
        log_func(f"[{index}/{total}] ✅ Zapisano raw_data + obrazki dla ID={obj.id}")
        return True
    except Exception as e:
        log_func(f"[{index}/{total}] ❌ Błąd przy zapisie raw_data dla ID={obj.id}: {e}")
        return False
