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

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

import java.util.List;

public interface OutboxEventRepository extends JpaRepository<OutboxEvent, Long> {

  /**
   * Unpublished events для polling. Использует partial index
   * {@code idx_outbox_unpublished} (where published_at IS NULL AND dlq_at IS NULL).
   */
  @Query("""
      SELECT o FROM OutboxEvent o
      WHERE o.publishedAt IS NULL AND o.dlqAt IS NULL
      ORDER BY o.id ASC
      """)
  List<OutboxEvent> findUnpublished(Pageable pageable);

  /**
   * Сколько ожидает публикации (без DLQ). Метрика
   * {@code ordinis_outbox_pending_events}.
   */
  @Query("SELECT COUNT(o) FROM OutboxEvent o WHERE o.publishedAt IS NULL AND o.dlqAt IS NULL")
  long countPending();

  /**
   * Сколько в DLQ. Метрика {@code ordinis_outbox_dlq_size} — растёт ⇒ алерт.
   */
  long countByDlqAtIsNotNull();

  /**
   * DLQ-листинг для admin UI. Партиальный индекс {@code idx_outbox_dlq} по
   * {@code dlq_at DESC}.
   */
  Page<OutboxEvent> findByDlqAtIsNotNull(Pageable pageable);

  /** @deprecated используйте {@link #countPending()} (не считает DLQ). */
  @Deprecated
  long countByPublishedAtIsNull();
}
