package infra

import (
	"net/http"
	"time"
)

// SSEKeepalive envia comentarios SSE periodicos (": keepalive\n\n") al writer
// hasta que done se cierre. Bloqueante: lanzar como goroutine.
// Sirve para evitar que proxies/load balancers cierren conexiones inactivas.
// Si w implementa http.Flusher hace flush tras cada keepalive.
func SSEKeepalive(w http.ResponseWriter, interval time.Duration, done <-chan struct{}) {
	if interval <= 0 {
		interval = 30 * time.Second
	}
	ticker := time.NewTicker(interval)
	defer ticker.Stop()

	flusher, _ := w.(http.Flusher)

	for {
		select {
		case <-done:
			return
		case <-ticker.C:
			if _, err := w.Write([]byte(": keepalive\n\n")); err != nil {
				return
			}
			if flusher != nil {
				flusher.Flush()
			}
		}
	}
}
