package cleanupsessions

import (
	"context"
	"time"

	"git.optclblast.xyz/draincloud/draincloud-core/internal/logger"
)

// TODO set with config
const cronInterval = time.Minute * 10

type ExpiredSessionsRemover interface {
	RemoveExpiredSessions(ctx context.Context) error
}

type CleanupSessionCron struct {
	db ExpiredSessionsRemover
}

func New(db ExpiredSessionsRemover) *CleanupSessionCron {
	return &CleanupSessionCron{
		db: db,
	}
}

func (c *CleanupSessionCron) Run(ctx context.Context) {
	logger.Info(ctx, "[CleanupSessionCron] running cron")
	go func() {
		t := time.NewTicker(cronInterval)
		defer t.Stop()
		for {
			select {
			case <-ctx.Done():
				logger.Warn(ctx, "[CleanupSessionCron] context cancelled")
				return
			case <-t.C:
				logger.Notice(ctx, "[CleanupSessionCron] cleanup started")
				t.Reset(cronInterval)
				if err := c.db.RemoveExpiredSessions(ctx); err != nil {
					logger.Error(ctx, "[CleanupSessionCron] failed to remove expired sessions", logger.Err(err))
				}
			}
		}
	}()
}
