"""Sueddeutsche Zeitung: Manuskripte auf sz.de.

Achtung: Viele SZ-Artikel sind hinter Paywall (SZ Plus). Der Scraper holt
den Inhalt, der ohne Login ausgeliefert wird. Ist nur ein Teaser vorhanden,
ist der Text-Length-Check in _common.MIN_TRANSCRIPT_LEN die Schutzschicht:
kurze Teaser werden verworfen, und der Aufrufer faellt auf die naechste
Kaskaden-Stufe (z. B. YouTube) zurueck — ohne Fehler.
"""
from __future__ import annotations

import logging
from typing import Optional

from . import TranscriptResult
from ._common import (
    episode_url,
    extract_longest_article_block,
    extract_text_by_container,
    fetch_html,
    matches_domain,
)

logger = logging.getLogger("osint.podcast.extractors.sz")

_DOMAINS = ("sz.de", "sueddeutsche.de")

_CONTAINER_PATTERNS = [
    r'<article[^>]*class="[^"]*article-body[^"]*"[^>]*>',
    r'<article[^>]*id="article-app-container"[^>]*>',
    r'<article\b[^>]*>',
    r'<main\b[^>]*>',
]


def can_handle(feed_entry: dict, feed_url: str) -> bool:
    url = episode_url(feed_entry) or feed_url
    return matches_domain(url, _DOMAINS) or matches_domain(feed_url, _DOMAINS)


async def fetch(feed_entry: dict, feed_url: str) -> Optional[TranscriptResult]:
    url = episode_url(feed_entry)
    if not url:
        return None
    html = await fetch_html(url)
    if not html:
        return None

    text = extract_text_by_container(html, _CONTAINER_PATTERNS)
    if not text:
        text = extract_longest_article_block(html)
    if not text:
        return None
    return TranscriptResult(text=text, source="website_scrape")
