package stateroot

import (
	"github.com/nspcc-dev/neo-go/pkg/crypto/hash"
	"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
	"github.com/nspcc-dev/neo-go/pkg/smartcontract"
)

// UpdateStateValidators updates list of state validator keys.
func (s *Module) UpdateStateValidators(height uint32, pubs keys.PublicKeys) {
	script, _ := smartcontract.CreateDefaultMultiSigRedeemScript(pubs)
	h := hash.Hash160(script)

	s.mtx.Lock()
	if s.updateValidatorsCb != nil {
		s.updateValidatorsCb(height, pubs)
	}
	kc := s.getKeyCacheForHeight(height)
	if kc.validatorsHash != h {
		s.keys = append(s.keys, keyCache{
			height:           height,
			validatorsKeys:   pubs,
			validatorsHash:   h,
			validatorsScript: script,
		})
	}
	s.mtx.Unlock()
}

func (s *Module) getKeyCacheForHeight(h uint32) keyCache {
	for i := len(s.keys) - 1; i >= 0; i-- {
		if s.keys[i].height <= h && (i+1 == len(s.keys) || s.keys[i+1].height < h) {
			return s.keys[i]
		}
	}
	return keyCache{}
}

// GetStateValidators returns current state validators.
func (s *Module) GetStateValidators(height uint32) keys.PublicKeys {
	s.mtx.RLock()
	defer s.mtx.RUnlock()
	return s.getKeyCacheForHeight(height).validatorsKeys.Copy()
}