"""Evaluate subscription access independently from payment-provider details."""

from __future__ import annotations

from datetime import datetime, timezone
from typing import Any


DIRECT_ACCESS_STATES = {"active", "trialing"}


def evaluate_subscription(status: str, metadata: dict[str, Any] | None, now: datetime | None = None) -> dict[str, Any]:
    now = now or datetime.now(timezone.utc)
    normalized = (status or "missing").lower()
    grace_until = _parse_datetime((metadata or {}).get("grace_until"))
    in_grace = normalized == "past_due" and grace_until is not None and now <= grace_until
    return {
        "status": normalized,
        "access_allowed": normalized in DIRECT_ACCESS_STATES or in_grace,
        "in_grace_period": in_grace,
        "grace_until": grace_until.isoformat() if grace_until else None,
        "access_reason": "grace_period" if in_grace else normalized,
    }


def _parse_datetime(value: Any) -> datetime | None:
    if not value:
        return None
    try:
        parsed = datetime.fromisoformat(str(value).replace("Z", "+00:00"))
    except ValueError:
        return None
    return parsed if parsed.tzinfo else parsed.replace(tzinfo=timezone.utc)
