package infra

import "net/http"

// SSEHandler retorna un http.HandlerFunc que setea los headers SSE,
// consume eventos del canal y los envia con flush. Cierra limpiamente
// si el cliente se desconecta (context cancelado) o si el canal se cierra.
//
// Headers seteados:
//   Content-Type: text/event-stream
//   Cache-Control: no-cache
//   Connection: keep-alive
//   X-Accel-Buffering: no   (deshabilita buffering en nginx)
func SSEHandler(events <-chan SSEEvent) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		flusher, ok := w.(http.Flusher)
		if !ok {
			http.Error(w, "streaming unsupported", http.StatusInternalServerError)
			return
		}

		w.Header().Set("Content-Type", "text/event-stream")
		w.Header().Set("Cache-Control", "no-cache")
		w.Header().Set("Connection", "keep-alive")
		w.Header().Set("X-Accel-Buffering", "no")
		w.WriteHeader(http.StatusOK)
		flusher.Flush()

		ctx := r.Context()
		for {
			select {
			case <-ctx.Done():
				return
			case ev, ok := <-events:
				if !ok {
					return
				}
				if err := SSESend(w, ev); err != nil {
					return
				}
			}
		}
	}
}
