"""Normalize date_from / date_to query params for inclusive range filters."""
from datetime import datetime, time

from django.utils import timezone
from django.utils.dateparse import parse_datetime, parse_date


def normalize_date_from(value):
    """Start of range (inclusive). Date-only → start of that day."""
    if not value:
        return None
    if hasattr(value, 'tzinfo'):
        dt = value
    else:
        raw = str(value).strip()
        dt = parse_datetime(raw)
        if dt is None:
            d = parse_date(raw[:10])
            if d is None:
                return None
            dt = datetime.combine(d, time.min)
    if timezone.is_naive(dt):
        dt = timezone.make_aware(dt)
    return dt


def normalize_date_to(value):
    """End of range (inclusive). Date-only → end of that day."""
    if not value:
        return None
    if hasattr(value, 'tzinfo'):
        dt = value
    else:
        raw = str(value).strip()
        # Full datetime: use as-is; date-only: end of day.
        dt = parse_datetime(raw)
        if dt is None:
            d = parse_date(raw[:10])
            if d is None:
                return None
            dt = datetime.combine(d, time.max)
        elif 'T' not in raw and ' ' not in raw and len(raw) <= 10:
            dt = datetime.combine(dt.date(), time.max)
    if timezone.is_naive(dt):
        dt = timezone.make_aware(dt)
    return dt


def date_range_params(request):
    """Return (date_from, date_to) normalized from request query params."""
    qp = getattr(request, 'query_params', None) or {}
    return (
        normalize_date_from(qp.get('date_from')),
        normalize_date_to(qp.get('date_to')),
    )
