package com.ruoyi.payment.service;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

import com.ruoyi.payment.domain.FundTransfer;

/**
 * 资金分配和结算服务接口
 * 
 * 处理贷款偿还优先级逻辑、剩余资金分配和债权状态更新
 * 
 * @author ruoyi
 */
public interface ISettlementService {
    
    /**
     * 执行资金分配和结算
     * 
     * @param escrowAccountId 监管账户ID
     * @param totalAmount 总金额
     * @return 分配结果
     */
    Map<String, Object> executeSettlement(Long escrowAccountId, BigDecimal totalAmount);
    
    /**
     * 偿还贷款本金和利息（优先级最高）
     * 
     * @param applicationId 融资申请ID
     * @param availableAmount 可用金额
     * @return 偿还结果和剩余金额
     */
    Map<String, Object> repayLoan(Long applicationId, BigDecimal availableAmount);
    
    /**
     * 分配剩余资金给安保公司
     * 
     * @param contractId 合同ID
     * @param remainingAmount 剩余金额
     * @return 分配结果
     */
    FundTransfer distributeRemainingFunds(Long contractId, BigDecimal remainingAmount);
    
    /**
     * 更新债权状态为已结清
     * 
     * @param creditId 债权ID
     * @return 更新结果
     */
    boolean updateCreditStatusToSettled(Long creditId);
    
    /**
     * 计算贷款偿还金额（本金+利息）
     * 
     * @param applicationId 融资申请ID
     * @return 偿还金额详情
     */
    Map<String, BigDecimal> calculateLoanRepaymentAmount(Long applicationId);
    
    /**
     * 验证资金分配的合法性
     * 
     * @param escrowAccountId 监管账户ID
     * @param totalAmount 总金额
     * @return 验证结果
     */
    boolean validateSettlement(Long escrowAccountId, BigDecimal totalAmount);
    
    /**
     * 获取资金分配计划
     * 
     * @param escrowAccountId 监管账户ID
     * @param totalAmount 总金额
     * @return 分配计划
     */
    Map<String, Object> getSettlementPlan(Long escrowAccountId, BigDecimal totalAmount);
    
    /**
     * 执行资金转账
     * 
     * @param fromAccountId 转出账户ID
     * @param toAccountId 转入账户ID
     * @param amount 转账金额
     * @param transferType 转账类型
     * @param description 描述
     * @return 转账记录
     */
    FundTransfer executeFundTransfer(Long fromAccountId, Long toAccountId, 
                                   BigDecimal amount, String transferType, String description);
    
    /**
     * 获取结算历史记录
     * 
     * @param escrowAccountId 监管账户ID
     * @return 结算历史
     */
    List<FundTransfer> getSettlementHistory(Long escrowAccountId);
    
    /**
     * 检查是否所有债务已结清
     * 
     * @param contractId 合同ID
     * @return 是否已结清
     */
    boolean isAllDebtsSettled(Long contractId);
    
    /**
     * 生成结算报告
     * 
     * @param escrowAccountId 监管账户ID
     * @return 结算报告
     */
    Map<String, Object> generateSettlementReport(Long escrowAccountId);
}