package consensus

import (
	"sync"
	"time"
)

// RoundState mantém o estado atual da altura e rodada de consenso.
type RoundState struct {
	Height          uint64            // Altura atual do consenso (número do bloco)
	Round           uint64            // Rodada atual (tentativas por altura)
	LockedBlock     string            // Hash do bloco "travado" (caso tenha precommit anterior)
	Proposal        string            // Hash da proposta atual recebida
	Prevotes        map[string]string // Mapa[ValidatorID] = BlockHash (pode ser vazio)
	Precommits      map[string]string // Mapa[ValidatorID] = BlockHash
	LastRoundStart  time.Time          // 🆕 Controle de início da rodada
	Mu              sync.RWMutex      // Proteção de acesso concorrente
}

// NewRoundState cria um estado novo para uma altura específica.
func NewRoundState(height uint64) *RoundState {
	return &RoundState{
		Height:          height,
		Round:           0,
		LockedBlock:     "",
		Proposal:        "",
		Prevotes:        make(map[string]string),
		Precommits:      make(map[string]string),
		LastRoundStart:  time.Now(),
	}
}

// ResetRound limpa os votos e proposta da rodada atual (usado ao iniciar nova rodada).
func (rs *RoundState) ResetRound(round uint64) {
	rs.Mu.Lock()
	defer rs.Mu.Unlock()
	rs.Round = round
	rs.Proposal = ""
	rs.Prevotes = make(map[string]string)
	rs.Precommits = make(map[string]string)
	rs.LastRoundStart = time.Now()
}