using AutoBidder.Models;
namespace AutoBidder.Utilities
{
///
/// Decide se un'asta conclusa può sparire da sola dall'elenco del monitor.
///
/// Perché serve. Le aste concluse restano nel monitor finché non le si
/// toglie a mano, e con l'aggiunta automatica accesa se ne accumulano centinaia: quelle
/// vive finiscono sepolte sotto quelle finite, che è il contrario di quello che serve
/// guardando un cruscotto.
///
/// Perché non basta togliere tutto. Un'asta su cui si è puntato è l'unica
/// che vale la pena riguardare: quanto è costata, se il ritiro dal duello è scattato al
/// momento giusto, se il prezzo finale sta dove ci si aspettava. Farla sparire da sola
/// significa perdere l'occasione di controllarla, e i soldi erano veri. Le altre — quelle
/// solo osservate — non hanno niente da dire che lo storico non dica meglio.
///
/// Da qui la forma della regola: si toglie di serie, si trattiene ciò su cui c'è
/// stato un esborso. Classe pura: nessuno stato, nessun orologio, nessun disco.
///
public static class FinishedAuctionCleanup
{
/// Cosa fare delle aste concluse, e cosa risparmiare.
public sealed class Options
{
/// Togliere da sole le aste concluse. Acceso di serie.
public bool Enabled { get; set; } = true;
///
/// Trattenere le aste su cui si è puntato, per poterle controllare a mano.
/// Acceso di serie: sono quelle costate qualcosa.
///
public bool KeepWithMyBids { get; set; } = true;
///
/// Trattenere le aste vinte. Acceso di serie: c'è da confermare l'acquisto su
/// Bidoo, e una vittoria sparita dall'elenco è il modo più semplice di
/// dimenticarsene.
///
public bool KeepWon { get; set; } = true;
///
/// Trattenere le aste finite con un errore o senza esito leggibile: sono
/// esattamente quelle da guardare. Acceso di serie.
///
public bool KeepUnclear { get; set; } = true;
}
/// Esito della decisione, col motivo per il registro.
public readonly record struct Verdict(bool Remove, string Reason);
///
/// Quest'asta conclusa si può togliere dall'elenco?
///
/// L'ordine dei controlli è quello che conta: prima le ragioni per
/// trattenere, poi la rimozione. Un'asta vinta su cui si è anche puntato deve
/// restare per il primo motivo che si incontra, non per l'ultimo, così il messaggio
/// nel registro dice la cosa più importante.
///
public static Verdict Decide(bool conclusa, bool vinta, int puntateMie, bool fineVista, Options options)
{
options ??= new Options();
if (!options.Enabled)
return new Verdict(false, "rimozione automatica spenta");
if (!conclusa)
return new Verdict(false, "asta non conclusa");
if (options.KeepWon && vinta)
return new Verdict(false, "vinta: resta in elenco per la conferma su Bidoo");
if (options.KeepWithMyBids && puntateMie > 0)
return new Verdict(false,
$"trattenuta: ci hai speso {puntateMie} puntate, controllala a mano");
if (options.KeepUnclear && !fineVista)
return new Verdict(false, "trattenuta: la fine non è stata vista, esito da controllare");
return new Verdict(true, "conclusa senza puntate mie: tolta dall'elenco");
}
///
/// Comodità per il motore: legge dall'asta i quattro numeri che servono.
///
/// Le puntate si prendono dal massimo fra il contatore dell'asta e quello di
/// sessione: uno dei due può essere a zero a seconda di come l'asta è entrata nel
/// monitor, e trattenere per eccesso è l'errore giusto da fare.
///
public static Verdict Decide(AuctionInfo auction, bool vinta, Options options)
{
if (auction == null) return new Verdict(false, "nessuna asta");
var perAsta = auction.BidsUsedOnThisAuction ?? 0;
var puntate = perAsta > auction.SessionBidCount ? perAsta : auction.SessionBidCount;
return Decide(
conclusa: !string.IsNullOrWhiteSpace(auction.ConcludedOutcome),
vinta: vinta,
puntateMie: puntate,
fineVista: auction.ObservedToEnd,
options);
}
}
}