package com.pingcap.community.blogserver.config;

import com.pingcap.community.blogserver.support.webhook.WebhookEventHandler;
import com.pingcap.community.blogserver.support.webhook.WebhookSubscriber;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.SubscribableChannel;
import org.springframework.messaging.support.ExecutorSubscribableChannel;
import org.springframework.retry.support.RetryTemplate;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.web.client.RestTemplate;

@Configuration
@ConfigurationProperties(prefix = "blog.webhook")
@Data
public class WebhookConfig {

  private String applicationName = "tidb-blog";

  private String instanceName = "tidb-blog-dev";

  private WebhookSubscriber[] subscribers = new WebhookSubscriber[]{};

  private final RestTemplate restTemplate;

  private final RetryTemplate retryTemplate;

  @Bean("blogWebhookEventChannel")
  SubscribableChannel blogWebhookEventChannel() {
    int subscriberNum = subscribers.length;

    if (subscriberNum <= 0) {
      return null;
    }

    ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
    taskExecutor.setCorePoolSize(subscriberNum);
    taskExecutor.setMaxPoolSize(subscriberNum * 2);
    taskExecutor.setQueueCapacity(Integer.MAX_VALUE);
    taskExecutor.setThreadNamePrefix("webhook-thread-");
    taskExecutor.initialize();
    ExecutorSubscribableChannel channel = new ExecutorSubscribableChannel(taskExecutor);

    for (WebhookSubscriber subscriber : subscribers) {
      WebhookEventHandler webhookHandler =
          new WebhookEventHandler(retryTemplate, applicationName, instanceName, subscriber, restTemplate);
      channel.subscribe(webhookHandler);
    }

    return channel;
  }

}
