package router

import (
	"context"
	"time"

	ctrl "sigs.k8s.io/controller-runtime"
)

const (
	gcInterval = 1 * time.Minute
)

func (rb *RouterBundle) RunGC(ctx context.Context) {
	ticker := time.NewTicker(gcInterval)
	defer ticker.Stop()
	for {
		select {
		case <-ctx.Done():
			return
		case <-ticker.C:
			rb.gc()
		}
	}
}

func (rb *RouterBundle) gc() {
	logger := ctrl.Log.WithName("GC")
	start := time.Now()
	logger.Info("start gateway gc check cycle")
	defer func() {
		logger.Info("finish gateway gc check cycle", "time", time.Since(start))
	}()

	idleRouters := make([]*Router, 0)
	rb.RLock()
	for _, router := range rb.routers {
		if router.IdleTooLong() {
			idleRouters = append(idleRouters, router)
		}
	}
	rb.RUnlock()

	for _, router := range idleRouters {
		logger.Info("gc", "token", router.token, "cluster_id", router.clusterID)
		router.Close()
		defer logger.Info("gc done", "token", router.token, "cluster_id", router.clusterID)
	}
}
