"""
Date utility functions for health data sync.
"""

from datetime import date, datetime, timedelta
from typing import List, Tuple


def parse_date(date_str: str) -> date:
    """Parse date string in YYYY-MM-DD format.

    Args:
        date_str: Date string to parse

    Returns:
        Parsed date object

    Raises:
        ValueError: If date string is invalid
    """
    try:
        return datetime.strptime(date_str, "%Y-%m-%d").date()
    except ValueError as e:
        raise ValueError(f"Invalid date format '{date_str}'. Expected YYYY-MM-DD.") from e


def date_range(start: date, end: date) -> List[date]:
    """Generate list of dates between start and end (inclusive).

    Args:
        start: Start date
        end: End date

    Returns:
        List of dates from start to end
    """
    days = (end - start).days + 1
    return [start + timedelta(days=i) for i in range(days)]


def split_date_range(
    start: date, end: date, batch_size: int = 30
) -> List[Tuple[date, date]]:
    """Split a date range into smaller batches.

    Args:
        start: Start date
        end: End date
        batch_size: Maximum days per batch (default: 30)

    Returns:
        List of (batch_start, batch_end) tuples
    """
    batches = []
    current = start

    while current <= end:
        batch_end = min(current + timedelta(days=batch_size - 1), end)
        batches.append((current, batch_end))
        current = batch_end + timedelta(days=1)

    return batches


def get_yesterday() -> date:
    """Get yesterday's date.

    Returns:
        Yesterday's date
    """
    return date.today() - timedelta(days=1)


def format_date(d: date) -> str:
    """Format date as YYYY-MM-DD string.

    Args:
        d: Date to format

    Returns:
        Formatted date string
    """
    return d.strftime("%Y-%m-%d")
