// Package domain defines all the domain models
package domain

import "time"

// ListTrade es la representacion exportada de un trade de List Trading.
type ListTrade struct {
	QuoteRequest FixMessageJSON `json:"quote_request"`
}

// 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]any `json:"header"`
	Body        map[string]any `json:"body"`
	Trailer     map[string]any `json:"trailer"`
	ReceiveTime time.Time      `json:"receive_time"`
}

// Message es una fila de qfixdpl_messages, con la metadata del header FIX hoisted
// para que los consumidores puedan ordenar/filtrar sin parsear el JSON.
type Message struct {
	ID           string         `json:"id"`
	SenderCompID string         `json:"sender_comp_id"`
	MsgSeqNum    int            `json:"msg_seq_num"`
	SendingTime  time.Time      `json:"sending_time"`
	CreatedAt    time.Time      `json:"created_at"`
	JMessage     FixMessageJSON `json:"j_message"`
}

// 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"`
}

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