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

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 org.springframework.data.repository.query.Param;

import java.util.List;
import java.util.Optional;
import java.util.UUID;

/**
 * Spring Data repository для schema workflow drafts.
 *
 * <p>Все queries фильтруют по {@code statusDb} string (lowercase в БД) —
 * см. {@link DictionarySchemaDraft} комментарий про status mapping.
 * Поэтому передаём DB-value напрямую (через
 * {@link SchemaDraftStatus#dbValue()}), не enum constant.
 */
public interface SchemaDraftRepository extends JpaRepository<DictionarySchemaDraft, UUID> {

  /**
   * Active (non-terminal) draft для dict — most важный lookup для UI banner
   * "у этого dict'а есть open draft, такой-то reviewer должен решить".
   * Возвращает Optional т.к. EXCLUDE constraint гарантирует max 1.
   */
  @Query("""
      SELECT d FROM DictionarySchemaDraft d
      WHERE d.dictionaryId = :dictionaryId
        AND d.statusDb IN ('draft', 'review_pending', 'changes_requested', 'approved')
      """)
  Optional<DictionarySchemaDraft> findActiveByDictionary(@Param("dictionaryId") UUID dictionaryId);

  /** All drafts for a dictionary, sorted newest-first. */
  @Query("""
      SELECT d FROM DictionarySchemaDraft d
      WHERE d.dictionaryId = :dictionaryId
      ORDER BY d.createdAt DESC
      """)
  List<DictionarySchemaDraft> findByDictionary(@Param("dictionaryId") UUID dictionaryId);

  /** Global review queue (status=review_pending) для pool reviewer'ов. */
  @Query("""
      SELECT d FROM DictionarySchemaDraft d
      WHERE d.statusDb = 'review_pending'
      ORDER BY d.submittedAt ASC
      """)
  Page<DictionarySchemaDraft> findPendingReview(Pageable pageable);

  /** Maker's own drafts (любой status). */
  @Query("""
      SELECT d FROM DictionarySchemaDraft d
      WHERE d.makerId = :makerId
      ORDER BY d.createdAt DESC
      """)
  Page<DictionarySchemaDraft> findByMaker(@Param("makerId") String makerId, Pageable pageable);
}
