package session

import (
	"context"
	"fmt"
	"time"

	"github.com/tidbcloud/account/commons/database"
	"github.com/tidbcloud/account/internel/dao"
	"github.com/tidbcloud/tiinf/monitor/tilog"
	"go.uber.org/zap"
)

const (
	tokenAliveSecs = 60 * 60 * 15
)

func CleanupUserSessions(ctx context.Context) error {
	tilog.Info(ctx, "cleanup user sessions start")
	var start uint64 = 0
	var limit = 10
	for {
		tilog.Info(ctx, fmt.Sprintf("cleanup user sessions get start id: %d", start))
		sessions, err := dao.GetDaoHub().UserSession.BatchListUserSessions(ctx, database.DBConn.DB, start, limit)
		if err != nil {
			tilog.Error(ctx, "cleanup user sessions batch list sessions error", zap.Any("err", err))
			return err
		}
		if len(sessions) == 0 {
			tilog.Info(ctx, "cleanup user sessions over")
			return nil
		}
		for _, session := range sessions {
			tilog.Info(ctx, "cleanup user sessions: handle session", zap.Any("id", session.ID), zap.Any("sid", session.SessionID))
			// set the max id to start
			if session.ID.Uint64() > start {
				start = session.ID.Uint64()
			}

			if time.Now().Unix()-session.CreatedAt.Unix() > tokenAliveSecs {
				err := dao.GetDaoHub().UserSession.DeleteUserSessionBySessionID(ctx, database.DBConn.DB, session.SessionID)
				tilog.Info(ctx, "cleanup user sessions: session created 10 hours ago, deleted", zap.Any("session", session), zap.Any("err", err))
			}
		}

	}
}
