package org.jpos.tcpay.db.repository;

import org.jpos.tcpay.db.entity.PosFailedTransaction;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

/**
 * Repository interface for PosFailedTransaction entities
 * Defines contract for failed transaction database operations
 */
public interface PosFailedTransactionRepository {
    
    /**
     * Save a failed transaction to the database
     * @param failedTransaction the entity to save
     * @return the saved entity with generated ID
     */
    PosFailedTransaction save(PosFailedTransaction failedTransaction);
    
    /**
     * Find failed transaction by ID
     * @param id the transaction ID
     * @return Optional containing the entity if found
     */
    Optional<PosFailedTransaction> findById(Long id);
    
    /**
     * Find failed transactions by bank terminal and merchant IDs
     * @param bTid bank terminal ID
     * @param bMid bank merchant ID
     * @return list of matching failed transactions
     */
    List<PosFailedTransaction> findByBankTidAndBankMid(String bTid, String bMid);
    
    /**
     * Count failed transactions since given date
     * @param since the cutoff date
     * @return count of failed transactions
     */
    long countTransactionsSince(LocalDateTime since);
    
    /**
     * Find failed transactions by response code
     * @param responseCode the response code to filter by
     * @return list of matching failed transactions
     */
    List<PosFailedTransaction> findByResponseCode(String responseCode);
    
    /**
     * Count all failed transactions
     * @return total count
     */
    long count();
}