using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Alpaca.Markets;
using DesktopBot.Models;
namespace DesktopBot.Services
{
///
/// Interfaccia per il servizio di trading - permette disaccoppiamento e testing
///
public interface ITradingService
{
///
/// Inizializza il client di trading con le credenziali API
///
/// Chiave API Alpaca
/// Secret API Alpaca
/// True per Paper Trading, False per Live
void Initialize(string apiKey, string apiSecret, bool isPaper);
///
/// Recupera il saldo disponibile del conto
///
Task GetAvailableEquityAsync();
///
/// Recupera le informazioni complete del conto (saldo, P&L, buying power, ecc.)
///
Task GetAccountAsync();
///
/// Recupera le barre storiche (candele) per un simbolo
///
/// Simbolo ticker (es. "AAPL")
/// Timeframe delle candele
/// Numero di barre da recuperare (convertito in intervallo temporale appropriato)
Task> GetHistoricalBarsAsync(string symbol, BarTimeFrame timeframe, int barCount);
///
/// Piazza un ordine bracket (con Take Profit e Stop Loss automatici).
/// NON supportato per crypto su Alpaca: usare PlaceMarketOrderAsync + SL/TP separati.
///
Task PlaceBracketOrderAsync(string symbol, decimal quantity, decimal entryPrice,
decimal takeProfitPrice, decimal stopLossPrice, OrderSide side);
///
/// Piazza un ordine market semplice (buy o sell). Usare per crypto.
///
Task PlaceMarketOrderAsync(string symbol, decimal quantity, OrderSide side);
///
/// Piazza un ordine stop-loss separato su una posizione aperta (per crypto).
///
Task PlaceStopOrderAsync(string symbol, decimal quantity, decimal stopPrice, OrderSide side);
///
/// Piazza un ordine limit (take-profit) separato su una posizione aperta (per crypto).
///
Task PlaceLimitOrderAsync(string symbol, decimal quantity, decimal limitPrice, OrderSide side);
///
/// Verifica se esiste una posizione aperta per un simbolo
///
Task HasOpenPositionAsync(string symbol);
///
/// Recupera tutte le posizioni aperte
///
Task> GetAllPositionsAsync();
///
/// Recupera la posizione aperta per un simbolo specifico.
/// Ritorna null se non esiste nessuna posizione aperta per quel simbolo.
///
Task GetPositionAsync(string symbol);
///
/// Recupera l'ultimo prezzo di un simbolo
///
Task GetLatestPriceAsync(string symbol);
///
/// Chiude tutte le posizioni aperte
///
Task CloseAllPositionsAsync();
///
/// Recupera gli ordini (aperti, chiusi o tutti)
///
/// Filtro stato: Open, Closed, All
/// Numero massimo di ordini da recuperare
Task> GetOrdersAsync(OrderStatusFilter statusFilter = OrderStatusFilter.Open, int limit = 50);
///
/// Cancella un ordine specifico per ID
///
Task CancelOrderAsync(Guid orderId);
///
/// Chiude una singola posizione aperta per simbolo
///
Task ClosePositionAsync(string symbol);
///
/// Recupera solo le posizioni aperte originate da ordini del bot
/// (riconosce gli ordini del bot tramite il prefisso BOT_ nel ClientOrderId).
/// Ritorna un sottoinsieme di GetAllPositionsAsync filtrato sui simboli
/// per cui esiste almeno un ordine buy filled con ClientOrderId che inizia per "BOT_".
///
Task> GetBotPositionsAsync();
///
/// Cerca asset disponibili su Alpaca per simbolo o nome.
/// Ritorna al massimo risultati tradabili.
///
Task> SearchAssetsAsync(string query, int maxResults = 20);
}
}