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

import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.auditing.DateTimeProvider;
import org.springframework.data.domain.AuditorAware;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

import java.time.OffsetDateTime;
import java.util.Optional;

/**
 * Включает {@code @CreatedBy}/{@code @LastModifiedBy}/{@code @CreatedDate}/{@code @LastModifiedDate}.
 *
 * <p>Domain не знает откуда приходит user identity — модули выше (app,
 * rest-api) подключают свой {@link AuditorAware} (JWT subject из @nstart/auth).
 * Default тут возвращает {@code "system"} для batch/internal операций.
 *
 * <p>{@link DateTimeProvider} явно возвращает {@link OffsetDateTime} — Spring
 * Data Auditing по дефолту не поддерживает {@code OffsetDateTime}, так что без
 * этого bean'а получим {@code IllegalArgumentException} при сохранении.
 */
@Configuration
@EnableJpaAuditing(auditorAwareRef = "auditorAware", dateTimeProviderRef = "auditingDateTimeProvider")
public class JpaAuditingConfig {

  @Bean
  @ConditionalOnMissingBean(AuditorAware.class)
  public AuditorAware<String> auditorAware() {
    return () -> Optional.of("system");
  }

  @Bean
  public DateTimeProvider auditingDateTimeProvider() {
    return () -> Optional.of(OffsetDateTime.now());
  }
}
