"""Клампинг diff_percent перед прямым INSERT в offer_price_history.

offer_price_history.diff_percent — NUMERIC(8,2) (±999999.99, см. миграцию
131_fix_diff_percent_overflow.sql). Та миграция клампит diff_percent, который
СЧИТАЕТ БД-триггер record_listing_price_change() на UPDATE listings, но триггер
не срабатывает на прямые INSERT из provider-модулей (domclick/cian detail),
которые пишут diff_percent, взятый напрямую из скрапленного HTML/JSON внешнего
источника. Garbage/экстремальное значение с редизайна source-страницы иначе
переполняет колонку и спамит "numeric field overflow" в проде.
"""

from __future__ import annotations

_DIFF_PERCENT_BOUND = 999999.99


def clamp_diff_percent(value: float | int | None) -> float | None:
    """Clamp raw scraped diff_percent into offer_price_history's NUMERIC(8,2) bound.

    Mirrors the DB-trigger clamp in migration 131_fix_diff_percent_overflow.sql
    (LEAST(GREATEST(x, -999999.99), 999999.99)) so direct application-level INSERTs
    (bypassing that trigger) cannot overflow the column either.
    """
    if value is None or isinstance(value, bool):
        return None
    try:
        numeric = float(value)
    except (TypeError, ValueError):
        return None
    return min(max(numeric, -_DIFF_PERCENT_BOUND), _DIFF_PERCENT_BOUND)
