package study.graphql;

import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;

import org.springframework.context.annotation.Configuration;
import org.springframework.graphql.execution.BatchLoaderRegistry;
import reactor.core.publisher.Mono;

/**
 * U50 底层批量加载：BatchLoaderRegistry 的命名 DataLoader 注册。
 * 每次请求由 DefaultExecutionGraphQlService 重新注册 DataLoader；缓存只在请求内有效。
 * load 计数用于断言 key 去重（3 本书共享 2 个作者 → 批函数只收到 2 个 key）。
 */
@Configuration(proxyBeanMethods = false)
public class BatchLoaderConfig {

    static final AtomicInteger BATCH_CALLS = new AtomicInteger();
    static final AtomicInteger BATCH_KEYS = new AtomicInteger();

    public BatchLoaderConfig(BatchLoaderRegistry registry) {
        registry.forTypePair(Long.class, Author.class)
                .registerMappedBatchLoader((java.util.Set<Long> ids, org.dataloader.BatchLoaderEnvironment env) -> {
                    BATCH_CALLS.incrementAndGet();
                    BATCH_KEYS.addAndGet(ids.size());
                    graphql.GraphQLContext graphQlContext = (graphql.GraphQLContext) env.getContext();
                    LibraryRepository repository = graphQlContext.get("repository");
                    Map<Long, Author> result = repository.findAuthorsByIds(ids);
                    return Mono.just(result);
                });
    }

    static void reset() {
        BATCH_CALLS.set(0);
        BATCH_KEYS.set(0);
    }
}
