package core

import (
	"fmt"
	"path"
	"runtime"
	"testing"

	"github.com/ethereum/go-ethereum/core/types"
	"github.com/ethereum/go-ethereum/ethdb"
	"github.com/ethereum/go-ethereum/ethutil"
	"github.com/ethereum/go-ethereum/event"
	//logpkg "github.com/ethereum/go-ethereum/logger"
)

//var Logger logpkg.LogSystem
//var Log = logpkg.NewLogger("TEST")

func init() {
	runtime.GOMAXPROCS(runtime.NumCPU())
	//Logger = logpkg.NewStdLogSystem(os.Stdout, log.LstdFlags, logpkg.InfoLevel)
	//logpkg.AddLogSystem(Logger)

	ethutil.ReadConfig("/tmp/ethtest", "/tmp/ethtest", "ETH")

	db, err := ethdb.NewMemDatabase()
	if err != nil {
		panic("Could not create mem-db, failing")
	}
	ethutil.Config.Db = db
}

func loadChain(fn string, t *testing.T) types.Blocks {
	c1, err := ethutil.ReadAllFile(path.Join("..", "_data", fn))
	if err != nil {
		fmt.Println(err)
		t.FailNow()
	}
	value := ethutil.NewValueFromBytes([]byte(c1))
	blocks := make(types.Blocks, value.Len())
	it := value.NewIterator()
	for it.Next() {
		blocks[it.Idx()] = types.NewBlockFromRlpValue(it.Value())
	}

	return blocks
}

func insertChain(done chan bool, chainMan *ChainManager, chain types.Blocks, t *testing.T) {
	err := chainMan.InsertChain(chain)
	if err != nil {
		fmt.Println(err)
		t.FailNow()
	}
	done <- true
}

func TestChainInsertions(t *testing.T) {
	chain1 := loadChain("chain1", t)
	chain2 := loadChain("chain2", t)
	var eventMux event.TypeMux
	chainMan := NewChainManager(&eventMux)
	txPool := NewTxPool(chainMan, nil, &eventMux)
	blockMan := NewBlockManager(txPool, chainMan, &eventMux)
	chainMan.SetProcessor(blockMan)

	const max = 2
	done := make(chan bool, max)

	go insertChain(done, chainMan, chain1, t)
	go insertChain(done, chainMan, chain2, t)

	for i := 0; i < max; i++ {
		<-done
	}
	fmt.Println(chainMan.CurrentBlock())
}