from datetime import date


ExpiryStatus = str


def effective_expiry_date(product_date: date | None, variant_dates: list[date | None] | None = None) -> date | None:
    dates = [d for d in [product_date, *(variant_dates or [])] if d is not None]
    return min(dates) if dates else None


def expiry_status(expiry_date: date | None, today: date | None = None, warning_days: int = 30) -> ExpiryStatus:
    if expiry_date is None:
        return "none"
    today = today or date.today()
    if expiry_date < today:
        return "expired"
    if (expiry_date - today).days <= warning_days:
        return "expiring"
    return "normal"


def status_matches(expiry_date: date | None, status: str | None, today: date | None = None, warning_days: int = 30) -> bool:
    return not status or expiry_status(expiry_date, today, warning_days) == status
