package types

// CurrencyPair describes base/quote currencies.
type CurrencyPair struct {
	Base  string `bson:"base,omitempty" json:"base,omitempty"`
	Quote string `bson:"quote,omitempty" json:"quote,omitempty"`
}

func (p *CurrencyPair) GetBase() string {
	if p == nil {
		return ""
	}
	return p.Base
}

func (p *CurrencyPair) GetQuote() string {
	if p == nil {
		return ""
	}
	return p.Quote
}

// FXSide indicates the direction of an FX trade.
type FXSide string

const (
	FXSideUnspecified      FXSide = "UNSPECIFIED"
	FXSideBuyBaseSellQuote FXSide = "BUY_BASE_SELL_QUOTE"
	FXSideSellBaseBuyQuote FXSide = "SELL_BASE_BUY_QUOTE"
)

// FXQuote captures a priced FX quote.
type FXQuote struct {
	QuoteRef        string        `bson:"quoteRef,omitempty" json:"quoteRef,omitempty"`
	Pair            *CurrencyPair `bson:"pair,omitempty" json:"pair,omitempty"`
	Side            FXSide        `bson:"side,omitempty" json:"side,omitempty"`
	Price           *Decimal      `bson:"price,omitempty" json:"price,omitempty"`
	BaseAmount      *Money        `bson:"baseAmount,omitempty" json:"baseAmount,omitempty"`
	QuoteAmount     *Money        `bson:"quoteAmount,omitempty" json:"quoteAmount,omitempty"`
	ExpiresAtUnixMs int64         `bson:"expiresAtUnixMs,omitempty" json:"expiresAtUnixMs,omitempty"`
	PricedAtUnixMs  int64         `bson:"pricedAtUnixMs,omitempty" json:"pricedAtUnixMs,omitempty"`
	Provider        string        `bson:"provider,omitempty" json:"provider,omitempty"`
	RateRef         string        `bson:"rateRef,omitempty" json:"rateRef,omitempty"`
	Firm            bool          `bson:"firm,omitempty" json:"firm,omitempty"`
}

func (q *FXQuote) GetPair() *CurrencyPair {
	if q == nil {
		return nil
	}
	return q.Pair
}

func (q *FXQuote) GetSide() FXSide {
	if q == nil {
		return FXSideUnspecified
	}
	return q.Side
}

func (q *FXQuote) GetPrice() *Decimal {
	if q == nil {
		return nil
	}
	return q.Price
}

func (q *FXQuote) GetBaseAmount() *Money {
	if q == nil {
		return nil
	}
	return q.BaseAmount
}

func (q *FXQuote) GetQuoteAmount() *Money {
	if q == nil {
		return nil
	}
	return q.QuoteAmount
}

func (q *FXQuote) GetExpiresAtUnixMs() int64 {
	if q == nil {
		return 0
	}
	return q.ExpiresAtUnixMs
}

func (q *FXQuote) GetPricedAtUnixMs() int64 {
	if q == nil {
		return 0
	}
	return q.PricedAtUnixMs
}

func (q *FXQuote) GetProvider() string {
	if q == nil {
		return ""
	}
	return q.Provider
}

func (q *FXQuote) GetRateRef() string {
	if q == nil {
		return ""
	}
	return q.RateRef
}

func (q *FXQuote) GetFirm() bool {
	if q == nil {
		return false
	}
	return q.Firm
}
