using System;

namespace PolyTraderSharp.Models
{
    /// <summary>Art eines Order-Lifecycle-Ereignisses (als String persistiert – erweiterbar).</summary>
    public enum OrderEventType
    {
        Placed,             // Order ans CLOB gesendet, Ergebnis in Response
        PlaceFailed,        // Platzierung fehlgeschlagen
        Cancelled,          // Order storniert (inkl. Grund in DetailsJson)
        LadderStart,        // erste GTC-Order der SELL-Leiter
        LadderStep,         // Nachpreisen eine Stufe tiefer
        FloorHold,          // Floor erreicht, Order ruht
        FloorReplaced,      // K1b: fehlende Floor-Order neu platziert
        DustAbort,          // H4: Leiter wegen Dust-Rest beendet
        StartupReconcileCancel, // K2: verwaiste Order beim Start storniert
        StaleCleanupCancel  // Stale-Order-Cleanup hat storniert
    }

    /// <summary>
    /// Ein Order-Lifecycle-Ereignis (core_order_events): Platzierungen, CLOB-Antworten, Cancels,
    /// Leiter-Stufen – als Daten statt nur als Log. Zusammen mit dem Entscheidungsjournal ergibt das
    /// die vollständige, rekonstruierbare Kette je Signal (Dossier).
    /// </summary>
    public class OrderEventRecord
    {
        public long Id { get; set; }                        // DB-Autoincrement
        public DateTime Timestamp { get; set; } = DateTime.UtcNow;

        public string SignalId { get; set; } = string.Empty;
        public string ModuleName { get; set; } = string.Empty;
        public int AccountId { get; set; }
        public string TokenId { get; set; } = string.Empty;

        public OrderEventType EventType { get; set; }
        public string Side { get; set; } = string.Empty;    // BUY/SELL
        public decimal Price { get; set; }
        public decimal AmountUsd { get; set; }
        public string OrderType { get; set; } = string.Empty; // GTC/GTD/FOK/MARKET

        /// <summary>CLOB-Antwort ("OK" oder Fehlertext) bzw. Ergebnis der Aktion.</summary>
        public string Response { get; set; } = string.Empty;

        /// <summary>Zusatzkontext als kompaktes JSON (z. B. Leiter-Stufe, Floor, Timeout-Grund).</summary>
        public string DetailsJson { get; set; } = string.Empty;
    }
}
