package identity

import (
	"context"
	"fmt"

	redisstore "qycw/go-server/internal/redis"
)

func refreshKey(userID int64, jti string) string {
	return redisstore.Key("refresh", fmt.Sprint(userID), jti)
}

func (s *Service) addRefresh(ctx context.Context, userID int64, jti string) error {
	if s.redis == nil {
		return ServiceUnavailable("Redis 未启用")
	}
	return s.redis.Set(ctx, refreshKey(userID, jti), "1", s.tokens.RefreshTTL()).Err()
}

func (s *Service) existsRefresh(ctx context.Context, userID int64, jti string) (bool, error) {
	if s.redis == nil {
		return false, ServiceUnavailable("Redis 未启用")
	}
	count, err := s.redis.Exists(ctx, refreshKey(userID, jti)).Result()
	return count > 0, err
}

func (s *Service) RevokeAllRefresh(ctx context.Context, userID int64) error {
	if s.redis == nil {
		return nil
	}
	var cursor uint64
	pattern := redisstore.Key("refresh", fmt.Sprint(userID), "*")
	for {
		keys, next, err := s.redis.Scan(ctx, cursor, pattern, 100).Result()
		if err != nil {
			return err
		}
		if len(keys) > 0 {
			if err := s.redis.Del(ctx, keys...).Err(); err != nil {
				return err
			}
		}
		cursor = next
		if cursor == 0 {
			return nil
		}
	}
}

func (s *Service) revokeRefresh(ctx context.Context, userID int64, jti string) error {
	if s.redis == nil {
		return ServiceUnavailable("Redis 未启用")
	}
	return s.redis.Del(ctx, refreshKey(userID, jti)).Err()
}
