package crypto_test

import (
	"bytes"
	"testing"
	"time"

	"github.com/stretchr/testify/assert"
	"go.uber.org/zap"
	"source.quilibrium.com/quilibrium/monorepo/node/crypto"
	"source.quilibrium.com/quilibrium/monorepo/node/protobufs"
)

func TestMasterProve(t *testing.T) {
	l, _ := zap.NewProduction()
	w := crypto.NewWesolowskiFrameProver(l)
	m, err := w.CreateMasterGenesisFrame([]byte{
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	}, bytes.Repeat([]byte{0x00}, 516), 10000)
	assert.NoError(t, err)

	next, err := w.ProveMasterClockFrame(
		m,
		time.Now().UnixMilli(),
		10000,
		[]*protobufs.InclusionAggregateProof{},
	)
	assert.NoError(t, err)
	err = w.VerifyMasterClockFrame(next)
	assert.NoError(t, err)
}

func TestCalculateChallengeProofDifficulty(t *testing.T) {
	l, _ := zap.NewProduction()
	w := crypto.NewWesolowskiFrameProver(l)

	// At 0 increments, the difficulty should be 200,000
	difficulty0 := w.CalculateChallengeProofDifficulty(0)
	assert.Equal(t, 200000, difficulty0)

	// At 100,000 increments, the difficulty should be 175,000
	difficulty100k := w.CalculateChallengeProofDifficulty(100000)
	assert.Equal(t, 175000, difficulty100k)

	// At 700,000 increments, the difficulty should be 25,000
	difficulty700k := w.CalculateChallengeProofDifficulty(700000)
	assert.Equal(t, 25000, difficulty700k)

	// At 800,000 increments, the difficulty should stay at 25,000
	difficulty800k := w.CalculateChallengeProofDifficulty(800000)
	assert.Equal(t, 25000, difficulty800k)
}