package cloud.nstart.terravault.ordinis.notifications.config;

import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.scheduling.annotation.EnableScheduling;

import java.nio.charset.StandardCharsets;

/**
 * Auto-configuration для notifications module.
 *
 * <p>Активна только при {@code ordinis.notifications.enabled=true}. Без этого
 * флага consumer не запускается, channels не register'ятся, sweep/retention
 * jobs не start'ят. Outbox events накапливаются в Kafka topic, на enable
 * консьюмер начнёт с {@code auto-offset-reset: latest} (backlog burst guard).
 *
 * <p>Module включается в writer pod через {@code @ComponentScan} + Helm value
 * {@code writer.notificationsEnabled}. Read-api / projection-writer — disabled.
 */
@Configuration
@ConditionalOnProperty(name = "ordinis.notifications.enabled", havingValue = "true", matchIfMissing = false)
@EnableConfigurationProperties(NotificationsProperties.class)
@EnableScheduling
@EnableCaching
@ComponentScan(basePackages = "cloud.nstart.terravault.ordinis.notifications")
public class NotificationsAutoConfiguration {

  /**
   * MessageSource для notifications templates. Отдельный bean (не shared с
   * application-wide MessageSource) — изолирует наши bundles от других modules.
   * Filename {@code messages/notifications} → resolves к
   * {@code messages/notifications_ru.properties} / {@code _en.properties}.
   */
  @Bean
  public MessageSource notificationsMessageSource() {
    ReloadableResourceBundleMessageSource ms = new ReloadableResourceBundleMessageSource();
    ms.setBasename("classpath:messages/notifications");
    ms.setDefaultEncoding(StandardCharsets.UTF_8.name());
    ms.setFallbackToSystemLocale(false);
    ms.setUseCodeAsDefaultMessage(false);  // throw NoSuchMessageException — fail loud
    return ms;
  }
}
