"""
Discovery engine (spec §6): rule-based surfacing over metric_history deltas — explicitly NOT a
predictive model (docs/ARCHITECTURE.md §9). A security is flagged when a configurable number of
its trailing metric deltas point the same positive direction.
"""
from __future__ import annotations

from dataclasses import dataclass, field
from typing import Optional

POSITIVE_SIGNAL_METRICS = [
    "revenue_growth_yoy", "eps_growth_yoy", "fcf_growth_yoy", "roic",
    "operating_margin", "net_debt_to_ebitda",  # last one inverted below (lower = better)
]
INVERTED_METRICS = {"net_debt_to_ebitda"}

DISCOVERY_STATUSES = ["DISCOVERED", "UNDER_REVIEW", "QUALIFIED", "WATCHLIST", "INVESTABLE", "REJECTED"]


@dataclass(frozen=True)
class DiscoverySignal:
    security_id: str
    positive_signal_count: int
    signals: dict[str, bool] = field(default_factory=dict)
    recommended_status: str = "DISCOVERED"


def evaluate_discovery_signal(
    current_values: dict[str, Optional[float]],
    prior_values: dict[str, Optional[float]],
    min_positive_signals_for_qualified: int = 4,
) -> DiscoverySignal:
    signals = {}
    for key in POSITIVE_SIGNAL_METRICS:
        cur, prior = current_values.get(key), prior_values.get(key)
        if cur is None or prior is None:
            continue
        improving = (cur < prior) if key in INVERTED_METRICS else (cur > prior)
        signals[key] = improving

    positive_count = sum(1 for v in signals.values() if v)
    status = "QUALIFIED" if positive_count >= min_positive_signals_for_qualified else (
        "UNDER_REVIEW" if positive_count >= 2 else "DISCOVERED"
    )
    return DiscoverySignal(security_id="", positive_signal_count=positive_count, signals=signals, recommended_status=status)
