"""Validate the TradingView emission time, independently of candle time."""
from datetime import datetime, timezone
import math

MAX_AGE_SECONDS = 60
MAX_FUTURE_SECONDS = 5

def _parse(value):
    if isinstance(value, bool) or value is None:
        raise ValueError('invalid timestamp')
    if isinstance(value, (int, float)):
        if not math.isfinite(value):
            raise ValueError('nonfinite timestamp')
        return datetime.fromtimestamp(value / 1000 if value > 100_000_000_000 else value, timezone.utc)
    parsed = datetime.fromisoformat(str(value).strip().replace('Z', '+00:00'))
    if parsed.tzinfo is None:
        raise ValueError('timezone required')
    return parsed.astimezone(timezone.utc)

def time_guard_error(payload, now=None):
    now = now or datetime.now(timezone.utc)
    values = [payload[k] for k in ('sent_at', 'timenow') if k in payload]
    if not values:
        return 'TIME_GUARD_MISSING_SENT_AT'
    try:
        times = [_parse(value) for value in values]
    except (ValueError, TypeError, OverflowError, OSError):
        return 'TIME_GUARD_INVALID_SENT_AT'
    if (max(times) - min(times)).total_seconds() > 1:
        return 'TIME_GUARD_CONFLICTING_TIMESTAMPS'
    age = (now - min(times)).total_seconds()
    if age < -MAX_FUTURE_SECONDS:
        return f'TIME_GUARD_FUTURE age_seconds={age:.3f}'
    if age > MAX_AGE_SECONDS:
        return f'TIME_GUARD_STALE age_seconds={age:.3f} limit={MAX_AGE_SECONDS}'
    return None
