"""Normalisierung — einheitliches Item-Schema {title, url, date, source, score, raw}."""
from __future__ import annotations

import datetime as dt
import logging
from urllib.parse import urlsplit, urlunsplit

log = logging.getLogger(__name__)

REQUIRED_KEYS = {"title", "url", "date", "source"}


def _normalize_url(url: str) -> str:
    parts = urlsplit(url.strip())
    netloc = parts.netloc.lower()
    if netloc.startswith("www."):
        netloc = netloc[4:]
    path = parts.path.rstrip("/") or "/"
    return urlunsplit((parts.scheme.lower(), netloc, path, parts.query, ""))


def _coerce_date(value) -> str:
    if isinstance(value, dt.datetime):
        return value.astimezone(dt.timezone.utc).isoformat()
    if isinstance(value, dt.date):
        return value.isoformat()
    if isinstance(value, str):
        return value
    return dt.datetime.now(dt.timezone.utc).isoformat()


def normalize_items(items: list[dict]) -> list[dict]:
    """Nimmt rohe Plattform-Items und normalisiert auf einheitliches Schema."""
    out: list[dict] = []
    for raw_item in items:
        missing = REQUIRED_KEYS - set(raw_item)
        if missing:
            log.warning("item missing required keys %s: %r", missing, raw_item)
            continue
        try:
            normalized = {
                "title": str(raw_item["title"]).strip(),
                "url": _normalize_url(raw_item["url"]),
                "date": _coerce_date(raw_item["date"]),
                "source": str(raw_item["source"]).strip().lower(),
                "score": raw_item.get("score"),
                "raw": raw_item.get("raw", {}),
            }
        except Exception as exc:  # noqa: BLE001
            log.warning("normalize failed for %r: %s", raw_item, exc)
            continue
        out.append(normalized)
    return out
