using System.Collections.Generic;
using System.Threading.Tasks;
using PolyTraderSharp.Models;

namespace PolyTraderSharp.Services
{
    /// <summary>
    /// Schmales Interface über die CLOB-Order-Operationen, die die SELL-Eskalationsleiter und die
    /// Startup-Reconciliation nutzen. Zweck: Diese geldkritischen Service-Interaktionen (Leiter vs.
    /// Cleanup, Neustart-Cancel) über einen gemockten Client integrationstestbar machen, ohne den
    /// echten <see cref="PolymarketClobClient"/> anzufassen.
    ///
    /// Bewusst minimal – nur die tatsächlich von den Modul-Services aufgerufenen Methoden. Die
    /// Preis-/Mengenberechnung bleibt als statische, reine Methode
    /// (<see cref="PolymarketClobClient.CalculateExactOrderAmounts"/>) außerhalb des Interfaces.
    /// </summary>
    public interface IClobClient
    {
        /// <summary>Platziert eine Order und liefert "OK" oder eine Fehlerbeschreibung.</summary>
        Task<string> PlaceOrderAsync(
            AccountState account, string tokenId, string sideStr, decimal investAmountUsd, decimal limitPrice,
            string orderType = "FOK", bool debugPayloadLog = false, bool isNegRisk = false, int actualFeeBps = 0,
            decimal? overrideTickSize = null, int? overrideMakerDecimals = null, int? overrideTakerDecimals = null);

        /// <summary>Cancelt konfligierende offene Orders desselben Tokens vor dem Nachpreisen/Platzieren.</summary>
        Task CancelConflictingOrdersAsync(AccountState acc, string assetId, decimal newPrice, string sideStr);

        /// <summary>
        /// Liefert die offenen Orders (Id, Side, Price). Mit <paramref name="assetId"/> nur für dieses
        /// Asset; ohne (leer) ALLE offenen Orders des Accounts – genutzt von der Startup-Reconciliation.
        /// </summary>
        Task<List<(string Id, string Side, decimal Price)>> GetOpenOrdersAsync(AccountState acc, string assetId = "");

        /// <summary>Cancelt eine einzelne Order per OrderId; true bei Erfolg.</summary>
        Task<bool> CancelOrderAsync(AccountState acc, string orderId);
    }
}
