package mana

import (
	"testing"

	"github.com/magiconair/properties/assert"
)

func TestBalance_CleanupTransferHistory(t *testing.T) {
	// initialize calculator
	calculator := NewCalculator(500, 0.1)

	// fill transfer history
	balance1 := NewBalance(calculator)
	balance1.BookTransfer(&Transfer{
		movedCoins:   1000,
		burnedMana:   10,
		receivedTime: 1000,
		spentTime:    1700,
	})
	balance1.BookTransfer(&Transfer{
		movedCoins:   1000,
		burnedMana:   0,
		receivedTime: 700,
		spentTime:    1000,
	})
	balance1.BookTransfer(&Transfer{
		movedCoins:   1000,
		burnedMana:   0,
		receivedTime: 0,
		spentTime:    700,
	})

	// cleanup transfer history
	if err := balance1.CleanupTransferHistory(1900); err != nil {
		t.Error(err)

		return
	}

	// check result (correct balance, correct history size)
	if val1, err := balance1.GetValue(); err != nil {
		t.Error(err)

		return
	} else {
		assert.Equal(t, val1, uint64(290))
	}
	assert.Equal(t, balance1.transferHistory.GetSize(), 1)
}

func TestBalance_AddTransfer(t *testing.T) {
	// initialize calculator
	calculator := NewCalculator(500, 0.1)

	// spend coins multiple times
	balance1 := NewBalance(calculator)
	balance1.BookTransfer(&Transfer{
		movedCoins:   1000,
		burnedMana:   10,
		receivedTime: 1000,
		spentTime:    1700,
	})
	balance1.BookTransfer(&Transfer{
		movedCoins:   1000,
		burnedMana:   0,
		receivedTime: 700,
		spentTime:    1000,
	})
	balance1.BookTransfer(&Transfer{
		movedCoins:   1000,
		burnedMana:   0,
		receivedTime: 0,
		spentTime:    700,
	})

	// hold coins for the full time
	balance2 := NewBalance(calculator)
	balance2.BookTransfer(&Transfer{
		movedCoins:   1000,
		burnedMana:   10,
		receivedTime: 0,
		spentTime:    1700,
	})

	// check result
	if val1, err := balance1.GetValue(); err != nil {
		t.Error(err)

		return
	} else {
		assert.Equal(t, val1, uint64(290))
	}
	if val2, err := balance2.GetValue(); err != nil {
		t.Error(err)

		return
	} else {
		assert.Equal(t, val2, uint64(291))
	}
}