using System;
namespace DesktopBot.Models
{
///
/// Rappresenta una singola istanza di bot configurata e associata a un asset.
/// L'ID univoco viene incorporato nel ClientOrderId di ogni ordine Alpaca,
/// così le posizioni aperte rimangono associabili al bot anche dopo un riavvio.
///
/// Formato ClientOrderId: "BOT_{BotId}_{timestamp}"
/// Esempio: "BOT_3f2a1b_20250610T143022"
///
/// VINCOLO: Ogni bot è strettamente associato a un SINGOLO asset con una SINGOLA strategia.
/// Una volta assegnato l'asset, il bot viene bloccato (IsAssetLocked=true) e non è più possibile
/// modificare Symbol, AssetClass o Strategy.
///
public class BotInstance
{
/// ID univoco del bot (6 hex chars, stabile nel tempo)
public string BotId { get; set; } = Guid.NewGuid().ToString("N").Substring(0, 6);
/// Nome leggibile assegnato dall'utente (es. "EMA AAPL #1")
public string Name { get; set; } = "Nuovo Bot";
/// Simbolo ticker associato (es. "AAPL", "MSFT")
public string Symbol { get; set; } = "";
/// Nome dell'asset completo (es. "Apple Inc.")
public string AssetName { get; set; } = "";
/// Classe dell'asset: "us_equity", "crypto", ecc.
public string AssetClass { get; set; } = "us_equity";
///
/// True quando il bot è stato associato a un asset e la configurazione è bloccata.
/// Dopo il lock, Symbol, AssetClass e Strategy non possono più essere modificati.
///
public bool IsAssetLocked { get; set; } = false;
///
/// Timestamp del momento in cui il bot è stato associato all'asset e bloccato.
/// Null se il bot non è ancora stato associato a un asset.
///
public DateTime? LockedAt { get; set; } = null;
/// Bot attivo o sospeso
public bool IsEnabled { get; set; } = true;
/// Configurazione della strategia
public BotConfiguration Config { get; set; } = new BotConfiguration();
/// Data e ora di creazione del bot
public DateTime CreatedAt { get; set; } = DateTime.Now;
/// Note libere dell'utente
public string Notes { get; set; } = "";
/// Colore badge nella UI (hex, es. "#00E676")
public string BadgeColor { get; set; } = "#00E676";
///
/// Blocca il bot associandolo definitivamente all'asset corrente.
/// Dopo questa operazione, Symbol, AssetClass e Strategy diventano immutabili.
///
public void LockToAsset()
{
if (!IsAssetLocked && !string.IsNullOrWhiteSpace(Symbol))
{
IsAssetLocked = true;
LockedAt = DateTime.Now;
}
}
}
}