from app.engines.valuation.blend import (
    BlendedFairValue, BusinessProfile, blend_fair_values, detect_business_profile,
)
from app.engines.valuation.dcf import DCFAssumptions, DCFResult, Scenario, run_all_scenarios, run_dcf
from app.engines.valuation.expected_return import (
    ExpectedReturnComponents, ExpectedReturnResult, compute_expected_return,
)
from app.engines.valuation.margin_of_safety import PriceBands, compute_margin_of_safety, compute_price_bands
from app.engines.valuation.multiples import (
    CompanyFundamentalsPerShare, MultipleFairValue, ReferenceMultiples, ReferenceSource,
    compute_multiples_fair_values, compute_self_historical_reference_multiples,
)
from app.engines.valuation.wacc import WACCInputs, WACCResult, compute_wacc

__all__ = [
    "BlendedFairValue", "BusinessProfile", "blend_fair_values", "detect_business_profile",
    "DCFAssumptions", "DCFResult", "Scenario", "run_all_scenarios", "run_dcf",
    "ExpectedReturnComponents", "ExpectedReturnResult", "compute_expected_return",
    "PriceBands", "compute_margin_of_safety", "compute_price_bands",
    "CompanyFundamentalsPerShare", "MultipleFairValue", "ReferenceMultiples", "ReferenceSource",
    "compute_multiples_fair_values", "compute_self_historical_reference_multiples",
    "WACCInputs", "WACCResult", "compute_wacc",
]


def cap_terminal_growth_at_risk_free(terminal_growth: float, risk_free_rate: float) -> float:
    """A company cannot grow faster than the economy forever (VALUATION.md §2) — enforced here
    so every caller building DCFAssumptions applies the same cap rather than each remembering to."""
    return min(terminal_growth, risk_free_rate)
