package agent

import "sync"

// FailureTracker — скользящее окно для расчёта call_failure_rate.
// Хранит последние N результатов звонков (success/failure),
// вычисляет процент неудачных звонков в реальном времени.
type FailureTracker struct {
	mu       sync.Mutex
	window   []bool // true=success, false=failure
	position int    // позиция следующей записи
	size     int    // текущий размер окна
	capacity int    // максимальный размер окна
}

// NewFailureTracker создаёт трекер с окном заданного размера.
func NewFailureTracker(capacity int) *FailureTracker {
	return &FailureTracker{
		window:   make([]bool, capacity),
		capacity: capacity,
	}
}

// Record записывает результат звонка (true=success, false=failure).
func (ft *FailureTracker) Record(success bool) {
	ft.mu.Lock()
	defer ft.mu.Unlock()

	ft.window[ft.position] = success
	ft.position = (ft.position + 1) % ft.capacity
	if ft.size < ft.capacity {
		ft.size++
	}
}

// Rate возвращает процент неудачных звонков (0.0..100.0).
func (ft *FailureTracker) Rate() float64 {
	ft.mu.Lock()
	defer ft.mu.Unlock()

	if ft.size == 0 {
		return 0
	}

	failures := 0
	for i := 0; i < ft.size; i++ {
		if !ft.window[i] {
			failures++
		}
	}
	return float64(failures) / float64(ft.size) * 100.0
}
