// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity ^0.8.19;

/**
 * @notice Dyadic rational input: mantissa × 2^(-shift).
 *         shift is reserved for future use and MUST be 0.  All production
 *         Optimizer implementations require shift == 0 and revert otherwise.
 *         When shift == 0 (as produced by _toDyadic), value == mantissa.
 */
struct OptimizerInput {
    int256 mantissa;
    int256 shift;
}

/// @dev Safe bear-mode defaults shared by Optimizer._bearDefaults() and
///      LiquidityManager.recenter()'s catch block.  Keep all four here so
///      the two call-sites cannot silently diverge.
uint256 constant BEAR_CAPITAL_INEFFICIENCY = 0;
uint256 constant BEAR_ANCHOR_SHARE = 3e17;
uint24  constant BEAR_ANCHOR_WIDTH = 100;
uint256 constant BEAR_DISCOVERY_DEPTH = 3e17;

/**
 * @title IOptimizer
 * @notice Minimal interface for the Optimizer contract consumed by LiquidityManager.
 *         Declaring the ABI here makes upgrade-compatibility explicit: any new
 *         Optimizer implementation must satisfy this selector or the LiquidityManager
 *         will fall back to bear-mode defaults via its try-catch.
 */
interface IOptimizer {
    /**
     * @notice Returns the four liquidity parameters used by LiquidityManager.recenter().
     * @return capitalInefficiency Capital buffer level (0..1e18, clamped to MAX_PARAM_SCALE). CI=0 is safest.
     * @return anchorShare         Fraction of non-floor ETH in anchor (0..1e18, clamped to MAX_PARAM_SCALE).
     * @return anchorWidth         Anchor position width in tick units (uint24); passed through to ThreePositionStrategy without clamping.
     * @return discoveryDepth      Discovery liquidity density (0..1e18, clamped to MAX_PARAM_SCALE).
     */
    function getLiquidityParams()
        external
        view
        returns (uint256 capitalInefficiency, uint256 anchorShare, uint24 anchorWidth, uint256 discoveryDepth);
}
