using System;
using PolyTrader.Core.Trading;

namespace PolyTrader.Modules.ResolutionFarming.Logic
{
    /// <summary>
    /// Reines Fill-/PnL-Modell für ResolutionFarming (Demo-Betrieb Phase RF-2). Einstieg realistisch
    /// mit Fee (Taker) bzw. ohne (Maker); PnL bei Auflösung (Gewinner-Share zahlt 1.0, Verlierer 0),
    /// abzüglich Entry-Fee. So sind Demo-Ergebnisse als Live-Vorhersage brauchbar.
    /// </summary>
    public static class FarmingFillModel
    {
        /// <summary>
        /// Shares für ein Budget zum Einstiegspreis, auf 2 Dezimalen abgerundet (Polymarket-Size-Tick).
        /// </summary>
        public static decimal SharesForBudget(decimal budgetUsd, decimal price)
        {
            if (budgetUsd <= 0m || price <= 0m) return 0m;
            return Math.Floor(budgetUsd / price * 100m) / 100m;
        }

        /// <summary>
        /// Realisierter PnL einer aufgelösten Farming-Position: Auszahlung (Gewinner: Shares × 1.0,
        /// sonst 0) − Einstiegskosten (Shares × Entry) − Entry-Fee. <paramref name="entryFeeBps"/> = 0
        /// für Maker-Einstieg (fee-frei), sonst der Taker-Satz.
        /// </summary>
        public static decimal ResolvePnl(decimal shares, decimal entryPrice, int entryFeeBps, bool isWinner)
        {
            decimal cost = shares * entryPrice;
            decimal fee = FeeModel.FeeUsd(cost, entryFeeBps);
            decimal payout = isWinner ? shares * 1.0m : 0m;
            return payout - cost - fee;
        }

        /// <summary>Einstiegskosten inkl. Fee (was tatsächlich vom Guthaben abgeht).</summary>
        public static decimal EntryCostWithFee(decimal shares, decimal entryPrice, int entryFeeBps)
        {
            decimal cost = shares * entryPrice;
            return cost + FeeModel.FeeUsd(cost, entryFeeBps);
        }
    }
}
