//go:build !integration

package consensus

import (
	"testing"

	"dappco.re/go/core/blockchain/config"
	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

func TestBaseReward_Good(t *testing.T) {
	assert.Equal(t, config.Premine, BaseReward(0), "genesis returns premine")
	assert.Equal(t, config.BlockReward, BaseReward(1), "block 1 returns standard reward")
	assert.Equal(t, config.BlockReward, BaseReward(10000), "arbitrary height")
}

func TestBlockReward_Good(t *testing.T) {
	base := config.BlockReward

	// Small block: full reward.
	reward, err := BlockReward(base, 1000, config.BlockGrantedFullRewardZone)
	require.NoError(t, err)
	assert.Equal(t, base, reward)

	// Block at exactly the zone boundary: full reward.
	reward, err = BlockReward(base, config.BlockGrantedFullRewardZone, config.BlockGrantedFullRewardZone)
	require.NoError(t, err)
	assert.Equal(t, base, reward)
}

func TestBlockReward_Bad(t *testing.T) {
	base := config.BlockReward
	median := config.BlockGrantedFullRewardZone

	// Block larger than 2*median: rejected.
	_, err := BlockReward(base, 2*median+1, median)
	assert.Error(t, err)
	assert.Contains(t, err.Error(), "too large")
}

func TestBlockReward_Ugly(t *testing.T) {
	base := config.BlockReward
	median := config.BlockGrantedFullRewardZone

	// Block slightly over zone: penalty applied, reward < base.
	reward, err := BlockReward(base, median+10_000, median)
	require.NoError(t, err)
	assert.Less(t, reward, base, "penalty should reduce reward")
	assert.Greater(t, reward, uint64(0), "reward should be positive")
}

func TestMinerReward_Good(t *testing.T) {
	base := config.BlockReward
	fees := uint64(50_000_000_000) // 0.05 LTHN

	// Pre-HF4: fees added.
	total := MinerReward(base, fees, false)
	assert.Equal(t, base+fees, total)

	// Post-HF4: fees burned.
	total = MinerReward(base, fees, true)
	assert.Equal(t, base, total)
}
