package mocks

import (
	"context"

	"git.grassecon.net/urdt/ussd/models"
	dataserviceapi "github.com/grassrootseconomics/ussd-data-service/pkg/api"
	"github.com/stretchr/testify/mock"
)

// MockAccountService implements AccountServiceInterface for testing
type MockAccountService struct {
	mock.Mock
}

func (m *MockAccountService) CreateAccount(ctx context.Context) (*models.AccountResult, error) {
	args := m.Called()
	return args.Get(0).(*models.AccountResult), args.Error(1)
}

func (m *MockAccountService) CheckBalance(ctx context.Context, publicKey string) (*models.BalanceResult, error) {
	args := m.Called(publicKey)
	return args.Get(0).(*models.BalanceResult), args.Error(1)
}

func (m *MockAccountService) TrackAccountStatus(ctx context.Context, trackingId string) (*models.TrackStatusResult, error) {
	args := m.Called(trackingId)
	return args.Get(0).(*models.TrackStatusResult), args.Error(1)
}

func (m *MockAccountService) FetchVouchers(ctx context.Context, publicKey string) ([]dataserviceapi.TokenHoldings, error) {
	args := m.Called(publicKey)
	return args.Get(0).([]dataserviceapi.TokenHoldings), args.Error(1)
}

func (m *MockAccountService) FetchTransactions(ctx context.Context, publicKey string) ([]dataserviceapi.Last10TxResponse, error) {
	args := m.Called(publicKey)
	return args.Get(0).([]dataserviceapi.Last10TxResponse), args.Error(1)
}

func (m *MockAccountService) VoucherData(ctx context.Context, address string) (*models.VoucherDataResult, error) {
	args := m.Called(address)
	return args.Get(0).(*models.VoucherDataResult), args.Error(1)
}

func (m *MockAccountService) TokenTransfer(ctx context.Context, amount, from, to, tokenAddress string) (*models.TokenTransferResponse, error) {
	args := m.Called()
	return args.Get(0).(*models.TokenTransferResponse), args.Error(1)
}

func (m *MockAccountService) CheckAliasAddress(ctx context.Context, alias string) (*dataserviceapi.AliasAddress, error) {
	args := m.Called(alias)
	return args.Get(0).(*dataserviceapi.AliasAddress), args.Error(1)
}