package oracle

import (
	"fmt"
	"math"
	"time"
)

// ValidateMajority recebe múltiplas leituras e tenta achar um consenso baseado na maioria simples.
func ValidateMajority(data []*OracleData, tolerance float64) (*OracleData, error) {
	if len(data) == 0 {
		return nil, fmt.Errorf("nenhum dado recebido para validar")
	}

	count := make(map[float64]int)
	latest := make(map[float64]time.Time)

	for _, d := range data {
		rounded := math.Round(d.Value/tolerance) * tolerance // agrupar valores similares
		count[rounded]++
		if d.Time.After(latest[rounded]) {
			latest[rounded] = d.Time
		}
	}

	// Encontrar o valor com mais votos
	var maxVal float64
	var maxCount int
	for val, c := range count {
		if c > maxCount {
			maxVal = val
			maxCount = c
		}
	}

	// Retornar o OracleData mais recente com esse valor
	for _, d := range data {
		rounded := math.Round(d.Value/tolerance) * tolerance
		if rounded == maxVal && d.Time.Equal(latest[maxVal]) {
			return d, nil
		}
	}

	return nil, fmt.Errorf("nenhum consenso válido encontrado")
}