package study.graphql;

import org.springframework.context.annotation.Configuration;
import org.springframework.graphql.server.WebGraphQlInterceptor;
import org.springframework.graphql.server.WebGraphQlRequest;
import org.springframework.graphql.server.WebGraphQlResponse;
import org.springframework.context.annotation.Bean;
import org.springframework.core.annotation.Order;
import reactor.core.publisher.Mono;

/**
 * U50 拦截器链：从 HTTP 头读取租户号并按请求清理；顺序敏感（先鉴权后租户亦可）。
 * 真实请求头进入 GraphQLContext 的入口就在 WebGraphQlInterceptor。
 */
@Configuration(proxyBeanMethods = false)
public class GraphqlWebConfig {

    @Bean
    @Order(1)
    WebGraphQlInterceptor tenantInterceptor(LibraryRepository repository) {
        return (request, chain) -> {
            String tenant = request.getHeaders().getFirst("X-Tenant");
            final String resolved = (tenant == null || tenant.isBlank()) ? "tenant-a" : tenant;
            request.configureExecutionInput((input, builder) ->
                    builder.graphQLContext(ctx -> ctx.put("X-Tenant", resolved))
                            .graphQLContext(ctx -> ctx.put("repository", repository))
                            .build());
            TenantContext.set(resolved);
            return chain.next(request).doFinally(signal -> TenantContext.clear());
        };
    }
}
