// Package domain defines all the domain models
package domain

import "time"

// TradeStatus represents the lifecycle state of a List Trading trade.
type TradeStatus string

const (
	TradeStatusActive    TradeStatus = "active"
	TradeStatusRejected  TradeStatus = "rejected"
	TradeStatusCompleted TradeStatus = "completed"
)

// ListTrade es la representacion exportada de un trade de List Trading.
type ListTrade struct {
	QuoteReqID    string      `json:"quote_req_id"`
	TradeID       string      `json:"trade_id,omitempty"`
	ListID        string      `json:"list_id"`
	Symbol        string      `json:"symbol"`
	SecurityIDSrc string      `json:"security_id_src"`
	Currency      string      `json:"currency"`
	Side          string      `json:"side"`
	OrderQty      string      `json:"order_qty"`
	SettlDate     string      `json:"settl_date"`
	Price         string      `json:"price"`
	OwnerTraderID string      `json:"owner_trader_id"`
	Status        TradeStatus `json:"status"`
}

// FixMessageJSON es la representacion estructurada de un mensaje FIX para almacenamiento.
type FixMessageJSON struct {
	Direction   string                 `json:"direction"`
	MsgType     string                 `json:"msg_type"`
	QuoteReqID  string                 `json:"quote_req_id"`
	Header      map[string]interface{} `json:"header"`
	Body        map[string]interface{} `json:"body"`
	ReceiveTime time.Time              `json:"receive_time"`
}

// TradeMessage es una fila de qfixdpl_messages.
type TradeMessage struct {
	ID         string         `json:"id"`
	QuoteReqID string         `json:"quote_req_id"`
	TradeID    string         `json:"trade_id,omitempty"`
	JMessage   FixMessageJSON `json:"j_message"`
	CreatedAt  time.Time      `json:"created_at"`
}

// LogEntry es el DTO para insertar/actualizar un log crudo en qfixdpl_logs.
type LogEntry struct {
	QuoteReqID string
	RawMsg     string
}

// Logs es la respuesta del endpoint GET /trades/:quoteReqID/logs.
type Logs struct {
	Entries []string `json:"entries"`
}

// FullTradeLog es la respuesta del endpoint GET /trades/:id/full-log.
type FullTradeLog struct {
	QuoteReqID string   `json:"quote_req_id"`
	TradeID    string   `json:"trade_id,omitempty"`
	DPLEntries []string `json:"dpl_entries"`
	PTEntries  []string `json:"pt_entries,omitempty"`
}

// PersistenceStore define la interfaz de persistencia.
type PersistenceStore interface {
	SaveMessage(msg TradeMessage) error
	SaveLog(entry LogEntry) error
	GetTodayMessages() ([]TradeMessage, error)
	GetLogsByQuoteReqID(quoteReqID string) (Logs, error)
	UpdateLogTradeID(quoteReqID, tradeID string) error
	GetFullTradeLog(id string) (FullTradeLog, error)
}
