package com.ruoyi.credit.mapper;

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

import org.apache.ibatis.annotations.Param;

import com.ruoyi.credit.domain.LoanConsistencyValidation;

/**
 * 贷款一致性验证Mapper接口
 *
 * @author ruoyi
 * @date 2025-12-30
 */
public interface LoanConsistencyMapper {

    /**
     * 查询贷款一致性验证记录
     *
     * @param validationId 验证记录主键
     * @return 贷款一致性验证记录
     */
    public LoanConsistencyValidation selectLoanConsistencyValidationByValidationId(Long validationId);

    /**
     * 查询贷款一致性验证记录列表
     *
     * @param loanConsistencyValidation 贷款一致性验证记录
     * @return 贷款一致性验证记录集合
     */
    public List<LoanConsistencyValidation> selectLoanConsistencyValidationList(LoanConsistencyValidation loanConsistencyValidation);

    /**
     * 根据贷款ID查询最新的验证记录
     *
     * @param loanId 贷款ID
     * @return 最新的验证记录
     */
    public LoanConsistencyValidation selectLatestValidationByLoanId(Long loanId);

    /**
     * 根据贷款ID列表查询最新的验证记录
     *
     * @param loanIds 贷款ID列表
     * @return 验证记录集合
     */
    public List<LoanConsistencyValidation> selectLatestValidationsByLoanIds(@Param("loanIds") List<Long> loanIds);

    /**
     * 按时间范围查询验证记录
     *
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 验证记录集合
     */
    public List<LoanConsistencyValidation> selectValidationsByTimeRange(@Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 按验证结果筛选记录
     *
     * @param validationStatus 验证状态
     * @return 验证记录集合
     */
    public List<LoanConsistencyValidation> selectValidationsByStatus(@Param("validationStatus") String validationStatus);

    /**
     * 按时间范围和验证结果筛选记录
     *
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param validationStatus 验证状态
     * @return 验证记录集合
     */
    public List<LoanConsistencyValidation> selectValidationsByTimeRangeAndStatus(
            @Param("startTime") Date startTime,
            @Param("endTime") Date endTime,
            @Param("validationStatus") String validationStatus);

    /**
     * 查询通过验证的贷款ID列表
     *
     * @return 通过验证的贷款ID集合
     */
    public List<Long> selectPassedLoanIds();

    /**
     * 查询失败验证的贷款ID列表
     *
     * @return 失败验证的贷款ID集合
     */
    public List<Long> selectFailedLoanIds();

    /**
     * 查询需要重新验证的贷款记录（超过指定时间未验证的记录）
     *
     * @param hours 小时数
     * @return 需要重新验证的贷款ID集合
     */
    public List<Long> selectLoansNeedRevalidation(@Param("hours") Integer hours);

    /**
     * 统计验证记录数量按状态分组
     *
     * @return 统计结果Map，key为状态，value为数量
     */
    public List<Map<String, Object>> selectValidationCountByStatus();

    /**
     * 统计指定时间范围内的验证记录数量
     *
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 验证记录数量
     */
    public Integer countValidationsByTimeRange(@Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 新增贷款一致性验证记录
     *
     * @param loanConsistencyValidation 贷款一致性验证记录
     * @return 结果
     */
    public int insertLoanConsistencyValidation(LoanConsistencyValidation loanConsistencyValidation);

    /**
     * 批量新增贷款一致性验证记录
     *
     * @param validationList 验证记录列表
     * @return 结果
     */
    public int batchInsertLoanConsistencyValidation(@Param("validationList") List<LoanConsistencyValidation> validationList);

    /**
     * 修改贷款一致性验证记录
     *
     * @param loanConsistencyValidation 贷款一致性验证记录
     * @return 结果
     */
    public int updateLoanConsistencyValidation(LoanConsistencyValidation loanConsistencyValidation);

    /**
     * 批量更新验证结果
     *
     * @param loanIds 贷款ID列表
     * @param validationStatus 验证状态
     * @param validationResult 验证结果
     * @param failureReason 失败原因
     * @param validatedBy 验证执行者
     * @param ruleVersion 规则版本
     * @return 结果
     */
    public int batchUpdateValidationResults(@Param("loanIds") List<Long> loanIds,
            @Param("validationStatus") String validationStatus,
            @Param("validationResult") String validationResult,
            @Param("failureReason") String failureReason,
            @Param("validatedBy") String validatedBy,
            @Param("ruleVersion") String ruleVersion);

    /**
     * 批量更新验证状态
     *
     * @param loanIds 贷款ID列表
     * @param validationStatus 验证状态
     * @param validatedBy 验证执行者
     * @return 结果
     */
    public int batchUpdateValidationStatus(@Param("loanIds") List<Long> loanIds,
            @Param("validationStatus") String validationStatus,
            @Param("validatedBy") String validatedBy);

    /**
     * 删除贷款一致性验证记录
     *
     * @param validationId 验证记录主键
     * @return 结果
     */
    public int deleteLoanConsistencyValidationByValidationId(Long validationId);

    /**
     * 批量删除贷款一致性验证记录
     *
     * @param validationIds 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteLoanConsistencyValidationByValidationIds(Long[] validationIds);

    /**
     * 根据贷款ID删除验证记录
     *
     * @param loanId 贷款ID
     * @return 结果
     */
    public int deleteLoanConsistencyValidationByLoanId(Long loanId);

    /**
     * 删除指定时间之前的验证记录（用于数据清理）
     *
     * @param beforeTime 指定时间
     * @return 结果
     */
    public int deleteValidationsBefore(@Param("beforeTime") Date beforeTime);

    /**
     * 根据债权凭证ID查询相关验证记录
     *
     * @param creditId 债权凭证ID
     * @return 验证记录集合
     */
    public List<LoanConsistencyValidation> selectValidationsByCreditId(Long creditId);

    /**
     * 根据服务周期ID查询相关验证记录
     *
     * @param servicePeriodId 服务周期ID
     * @return 验证记录集合
     */
    public List<LoanConsistencyValidation> selectValidationsByServicePeriodId(Long servicePeriodId);

    /**
     * 查询验证得分在指定范围内的记录
     *
     * @param minScore 最小得分
     * @param maxScore 最大得分
     * @return 验证记录集合
     */
    public List<LoanConsistencyValidation> selectValidationsByScoreRange(@Param("minScore") Integer minScore, @Param("maxScore") Integer maxScore);

    /**
     * 查询使用指定规则版本的验证记录
     *
     * @param ruleVersion 规则版本
     * @return 验证记录集合
     */
    public List<LoanConsistencyValidation> selectValidationsByRuleVersion(@Param("ruleVersion") String ruleVersion);

    /**
     * 查询所有服务周期内贷款申请且携带有债权凭证的贷款ID列表
     *
     * @return 贷款ID集合
     */
    public List<Long> selectLoansWithCreditCertificates();

    /**
     * 调试查询：获取所有贷款（不考虑状态限制）
     *
     * @return 贷款ID集合
     */
    public List<Long> selectAllLoansWithAnyCredit();

    /**
     * 根据贷款ID查询债权凭证信息
     *
     * @param loanId 贷款ID
     * @return 包含债权凭证ID、服务周期ID、合同ID等信息的Map
     */
    public Map<String, Object> selectLoanCreditInfo(Long loanId);

    /**
     * 查询通过验证的贷款详细信息
     *
     * @return 通过验证的贷款详细信息列表
     */
    public List<Map<String, Object>> selectPassedLoanDetails();

    /**
     * 查询完整的服务周期贷款信息
     *
     * @param loanId 贷款ID
     * @return 完整的服务周期贷款信息
     */
    public Map<String, Object> selectCompleteServicePeriodLoanInfo(Long loanId);

    /**
     * 调试贷款逐步信息
     *
     * @param loanId 贷款ID
     * @return 调试信息
     */
    public Map<String, Object> debugLoanStepByStep(Long loanId);

    /**
     * 调试基本贷款信息
     *
     * @param loanId 贷款ID
     * @return 基本贷款信息
     */
    public Map<String, Object> debugBasicLoanInfo(Long loanId);

    /**
     * 调试服务周期信息
     *
     * @param loanId 贷款ID
     * @return 服务周期信息
     */
    public Map<String, Object> debugServicePeriodInfo(Long loanId);

    /**
     * 调试合同信息
     *
     * @param loanId 贷款ID
     * @return 合同信息
     */
    public Map<String, Object> debugContractInfo(Long loanId);

    /**
     * 调试债权凭证信息
     *
     * @param loanId 贷款ID
     * @return 债权凭证信息
     */
    public Map<String, Object> debugCreditInfo(Long loanId);

    /**
     * 根据合同ID查询债权凭证ID
     *
     * @param contractId 合同ID
     * @return 债权凭证ID
     */
    public Long selectCreditIdByContractId(Long contractId);

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

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

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

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