from __future__ import annotations

from src.ctb_copy.models import CopyGateConfig, CopyGateDecision, PositionCopySignal, SignalDecision


def evaluate_copy_signal(signal: PositionCopySignal, config: CopyGateConfig | None = None) -> CopyGateDecision:
    cfg = config or CopyGateConfig()
    reasons: list[str] = []

    if not signal.is_position_level:
        reasons.append("fill_level_copying_disabled")
    if signal.position_age_hours < cfg.min_position_age_hours:
        reasons.append("position_age_below_6h")
    if signal.leader_profit_r > cfg.max_leader_profit_r_to_enter:
        reasons.append("leader_already_above_0_5r_profit")
    if signal.distance_to_leader_entry_pct > cfg.max_distance_to_leader_entry_pct:
        reasons.append("distance_to_leader_entry_too_large")
    if signal.spread_pct > cfg.max_spread_pct:
        reasons.append("spread_too_wide")
    if not signal.depth_ok:
        reasons.append("market_depth_not_ok")
    if signal.leader_liquidation_distance_pct < cfg.min_liquidation_distance_pct:
        reasons.append("leader_liquidation_distance_too_close")
    if abs(signal.funding_rate_hourly_pct) > cfg.max_abs_funding_rate_hourly_pct:
        reasons.append("funding_extreme")
    if signal.duplicate_exposure:
        reasons.append("duplicate_exposure_already_present")

    decision = SignalDecision.BLOCK if reasons else SignalDecision.ALLOW_SHADOW
    return CopyGateDecision(decision=decision, reasons=tuple(reasons) or ("ok_for_shadow_only",), signal=signal)
