package client

import (
	"context"

	fxv1 "github.com/tech/sendico/pkg/proto/common/fx/v1"
	moneyv1 "github.com/tech/sendico/pkg/proto/common/money/v1"
)

// Fake implements Client for tests.
type Fake struct {
	LatestRateFn func(ctx context.Context, req LatestRateParams) (*RateSnapshot, error)
	GetQuoteFn   func(ctx context.Context, req GetQuoteParams) (*Quote, error)
	CloseFn      func() error
}

func (f *Fake) LatestRate(ctx context.Context, req LatestRateParams) (*RateSnapshot, error) {
	if f.LatestRateFn != nil {
		return f.LatestRateFn(ctx, req)
	}
	return &RateSnapshot{
		Pair:      &fxv1.CurrencyPair{Base: "USD", Quote: "EUR"},
		Mid:       "1.1000",
		Bid:       "1.0995",
		Ask:       "1.1005",
		SpreadBps: "5",
		Provider:  "fake",
		RateRef:   "fake",
	}, nil
}

func (f *Fake) GetQuote(ctx context.Context, req GetQuoteParams) (*Quote, error) {
	if f.GetQuoteFn != nil {
		return f.GetQuoteFn(ctx, req)
	}
	return &Quote{
		QuoteRef: "fake-quote",
		Pair:     req.Pair,
		Side:     req.Side,
		Price:    "1.1000",
		BaseAmount: &moneyv1.Money{
			Amount:   "100.00",
			Currency: req.Pair.GetBase(),
		},
		QuoteAmount: &moneyv1.Money{
			Amount:   "110.00",
			Currency: req.Pair.GetQuote(),
		},
		Provider: "fake",
		RateRef:  "fake",
		Firm:     req.Firm,
	}, nil
}

func (f *Fake) Close() error {
	if f.CloseFn != nil {
		return f.CloseFn()
	}
	return nil
}
