package com.ruoyi.credit.service;

import java.util.List;
import java.util.Map;

import com.ruoyi.credit.domain.LoanConsistencyValidation;

/**
 * 贷款一致性验证服务接口
 * 
 * @author ruoyi
 * @date 2025-12-31
 */
public interface ILoanConsistencyService 
{
    /**
     * 获取通过验证的贷款列表（后端自动验证所有记录）
     * 
     * @param queryParams 查询参数
     * @return 通过验证的贷款ID列表
     */
    List<Long> getValidatedLoanList(Map<String, Object> queryParams);

    /**
     * 获取通过验证的贷款详细信息列表（后端自动验证所有记录）
     * 
     * @param queryParams 查询参数
     * @return 通过验证的贷款详细信息列表
     */
    List<Map<String, Object>> getValidatedLoanDetailsList(Map<String, Object> queryParams);

    /**
     * 重新验证指定贷款记录
     * 
     * @param loanId 贷款ID
     * @return 验证结果
     */
    LoanConsistencyValidation revalidateLoan(Long loanId);

    /**
     * 后台批量验证所有贷款记录
     * 
     * @return 验证结果统计
     */
    Map<String, Object> validateAllLoansInBackground();

    /**
     * 验证单个贷款记录的一致性
     * 
     * @param loanId 贷款ID
     * @param creditId 债权凭证ID（可选）
     * @param servicePeriodId 服务周期ID（可选）
     * @return 验证结果
     */
    LoanConsistencyValidation validateLoanConsistency(Long loanId, Long creditId, Long servicePeriodId);

    /**
     * 批量验证贷款记录的一致性
     * 
     * @param loanIds 贷款ID列表
     * @return 验证结果列表
     */
    List<LoanConsistencyValidation> batchValidateLoans(List<Long> loanIds);

    /**
     * 获取贷款验证历史记录
     * 
     * @param loanId 贷款ID
     * @return 验证历史记录列表
     */
    List<LoanConsistencyValidation> getLoanValidationHistory(Long loanId);

    /**
     * 获取验证统计信息
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 统计信息
     */
    Map<String, Object> getValidationStatistics(String startDate, String endDate);

    /**
     * 检查是否需要重新验证
     * 
     * @param loanId 贷款ID
     * @return 是否需要重新验证
     */
    boolean needsRevalidation(Long loanId);

    /**
     * 获取验证失败的贷款列表
     * 
     * @return 验证失败的贷款ID列表
     */
    List<Long> getFailedValidationLoans();

    /**
     * 清理过期的验证记录
     * 
     * @param daysToKeep 保留天数
     * @return 清理的记录数量
     */
    int cleanupExpiredValidations(int daysToKeep);

    /**
     * 触发重新验证机制
     * 
     * @param loanId 贷款ID
     * @param reason 重新验证原因
     * @return 重新验证结果
     */
    LoanConsistencyValidation triggerRevalidation(Long loanId, String reason);

    /**
     * 批量触发重新验证
     * 
     * @param loanIds 贷款ID列表
     * @param reason 重新验证原因
     * @return 重新验证结果统计
     */
    Map<String, Object> batchTriggerRevalidation(List<Long> loanIds, String reason);

    /**
     * 启动后台自动验证机制
     * 
     * @return 启动结果
     */
    Map<String, Object> startBackgroundValidation();

    /**
     * 停止后台自动验证机制
     * 
     * @return 停止结果
     */
    Map<String, Object> stopBackgroundValidation();

    /**
     * 获取后台验证状态
     * 
     * @return 后台验证状态信息
     */
    Map<String, Object> getBackgroundValidationStatus();

    /**
     * 获取所有需要验证的贷款ID列表（携带债权凭证的贷款）
     * 
     * @return 贷款ID列表
     */
    List<Long> getLoansWithCreditCertificates();

    /**
     * 调试方法：获取所有有债权的贷款（不考虑状态限制）
     *
     * @return 贷款ID列表
     */
    List<Long> getAllLoansWithAnyCredit();

    /**
     * 调试：统计所有贷款记录数量
     * 
     * @return 贷款记录数量
     */
    Integer countAllLoans();

    /**
     * 调试：统计所有债权记录数量
     * 
     * @return 债权记录数量
     */
    Integer countAllCredits();

    /**
     * 调试：统计所有服务周期记录数量
     * 
     * @return 服务周期记录数量
     */
    Integer countAllServicePeriods();

    /**
     * 调试：统计所有合同记录数量
     * 
     * @return 合同记录数量
     */
    Integer countAllContracts();
}