"""Calendar week and date utilities."""

from datetime import date


def date_to_kw(d: date) -> int:
    """Return ISO calendar week number."""
    return d.isocalendar()[1]


def date_to_jahr(d: date) -> int:
    """Return ISO calendar year (can differ from d.year at year boundaries)."""
    return d.isocalendar()[0]


def parse_german_date(s: str) -> date:
    """Parse German date formats: DD.MM.YY, DD.MM.YYYY, 'DD.MM.YY, HH:MM'.

    Handles edge cases:
    - Two-digit years: 00-49 -> 2000-2049, 50-99 -> 1950-1999
    - Invalid dates like '29.08.0196' -> raises ValueError
    - Leading/trailing whitespace
    - Comma-separated datetime: '02.02.26, 08:50' -> takes date part only
    """
    s = s.strip()
    if not s:
        raise ValueError("Empty date string")

    # Split off time part if present (e.g., "02.02.26, 08:50")
    if "," in s:
        s = s.split(",")[0].strip()

    parts = s.split(".")
    if len(parts) != 3:
        raise ValueError(f"Invalid date format: '{s}'")

    day = int(parts[0])
    month = int(parts[1])
    year_str = parts[2].strip()
    year = int(year_str)

    # Handle 2-digit years
    if year < 100:
        year = 2000 + year if year < 50 else 1900 + year

    # Reject obviously wrong years
    if year < 1900 or year > 2100:
        raise ValueError(f"Year out of range: {year}")

    return date(year, month, day)
